@@ -22,50 +22,41 @@ public class OllamaApiClientTests
22
22
[ SetUp ]
23
23
public async Task Setup ( )
24
24
{
25
- // Set up the test environment
26
25
_client = new OllamaApiClient ( _baseUri ) ;
27
-
28
26
await CleanupModel ( _localModel ) ;
29
27
}
30
28
31
29
[ TearDown ]
32
30
public async Task Teardown ( )
33
31
{
34
- // Clean up the test environment
35
32
await CleanupModel ( _localModel ) ;
36
-
37
33
( ( IChatClient ? ) _client ) ? . Dispose ( ) ;
38
34
}
39
35
40
36
private async Task CleanupModel ( string ? model = null )
41
37
{
42
- var modelExists = ( await _client . ListLocalModelsAsync ( ) )
43
- . Any ( m => m . Name == ( model ?? _model ) ) ;
38
+ var modelExists = ( await _client . ListLocalModelsAsync ( ) ) . Any ( m => m . Name == ( model ?? _model ) ) ;
44
39
45
40
if ( modelExists )
46
41
await _client . DeleteModelAsync ( new DeleteModelRequest { Model = model ?? _model } ) ;
47
42
}
48
43
49
44
private async Task PullIfNotExists ( string model )
50
45
{
51
- var modelExists = ( await _client . ListLocalModelsAsync ( ) )
52
- . Any ( m => m . Name == model ) ;
46
+ var modelExists = ( await _client . ListLocalModelsAsync ( ) ) . Any ( m => m . Name == model ) ;
53
47
54
48
if ( ! modelExists )
55
- await _client . PullModelAsync ( new PullModelRequest { Model = model } )
56
- . ToListAsync ( ) ;
49
+ await _client . PullModelAsync ( new PullModelRequest { Model = model } ) . ToListAsync ( ) ;
57
50
}
58
51
59
52
60
- [ Test , Category ( "Ft" ) , Order ( 1 ) , Ignore ( "Prevent the model from being downloaded each test run" ) ]
53
+ [ Test , Order ( 1 ) , Ignore ( "Prevent the model from being downloaded each test run" ) ]
61
54
public async Task PullModel ( )
62
55
{
63
- // Act
64
56
var response = await _client
65
57
. PullModelAsync ( new PullModelRequest { Model = _model } )
66
58
. ToListAsync ( ) ;
67
59
68
- // Assert
69
60
var models = await _client . ListLocalModelsAsync ( ) ;
70
61
models . Should ( ) . Contain ( m => m . Name == _model ) ;
71
62
@@ -77,7 +68,6 @@ public async Task PullModel()
77
68
[ Test , Order ( 2 ) ]
78
69
public async Task CreateModel ( )
79
70
{
80
- // Arrange
81
71
await PullIfNotExists ( _localModel ) ;
82
72
83
73
var model = new CreateModelRequest
@@ -94,12 +84,10 @@ PARAMETER num_ctx 100
94
84
"""
95
85
} ;
96
86
97
- // Act
98
87
var response = await _client
99
88
. CreateModelAsync ( model )
100
89
. ToListAsync ( ) ;
101
90
102
- // Assert
103
91
var models = await _client . ListLocalModelsAsync ( ) ;
104
92
models . Should ( ) . Contain ( m => m . Name . StartsWith ( _localModel ) ) ;
105
93
@@ -110,34 +98,27 @@ PARAMETER num_ctx 100
110
98
[ Test , Order ( 3 ) ]
111
99
public async Task CopyModel ( )
112
100
{
113
- // Arrange
114
101
await PullIfNotExists ( _localModel ) ;
115
102
116
103
var model = new CopyModelRequest { Source = _localModel , Destination = $ "{ _localModel } -copy" } ;
117
104
118
- // Act
119
105
await _client . CopyModelAsync ( model ) ;
120
106
121
- // Assert
122
107
var models = await _client . ListLocalModelsAsync ( ) ;
123
108
models . Should ( ) . Contain ( m => m . Name == $ "{ _localModel } -copy:latest") ;
124
109
125
- // Clean up
126
110
await _client . DeleteModelAsync ( new DeleteModelRequest { Model = $ "{ _localModel } -copy:latest" } ) ;
127
111
}
128
112
129
113
[ Test ]
130
114
public async Task Embed ( )
131
115
{
132
- // Arrange
133
116
await PullIfNotExists ( _embeddingModel ) ;
134
117
135
118
var request = new EmbedRequest { Model = _embeddingModel , Input = [ "Hello, world!" ] } ;
136
119
137
- // Act
138
120
var response = await _client . EmbedAsync ( request ) ;
139
121
140
- // Assert
141
122
response . Should ( ) . NotBeNull ( ) ;
142
123
response . Embeddings . Should ( ) . NotBeEmpty ( ) ;
143
124
response . LoadDuration . Should ( ) . BeGreaterThan ( 100 , "Because loading the model should take some time" ) ;
@@ -147,18 +128,15 @@ public async Task Embed()
147
128
[ Test ]
148
129
public async Task ListLocalModels ( )
149
130
{
150
- // Act
151
131
var models = ( await _client . ListLocalModelsAsync ( ) ) . ToList ( ) ;
152
132
153
- // Assert
154
133
models . Should ( ) . NotBeEmpty ( ) ;
155
134
models . Should ( ) . Contain ( m => m . Name == _model ) ;
156
135
}
157
136
158
137
[ Test ]
159
138
public async Task ListRunningModels ( )
160
139
{
161
- // Arrange
162
140
await PullIfNotExists ( _model ) ;
163
141
var backgroundTask = Task . Run ( async ( ) =>
164
142
{
@@ -171,28 +149,21 @@ public async Task ListRunningModels()
171
149
await generate ;
172
150
} ) ;
173
151
174
- // Act
175
152
var modelsTask = _client . ListRunningModelsAsync ( ) ;
176
-
177
153
await Task . WhenAll ( backgroundTask , modelsTask ) ;
178
154
179
- // Assert
180
155
var models = modelsTask . Result . ToList ( ) ;
181
-
182
156
models . Should ( ) . NotBeEmpty ( ) ;
183
157
models . Should ( ) . Contain ( m => m . Name == _model ) ;
184
158
}
185
159
186
160
[ Test ]
187
161
public async Task ShowModel ( )
188
162
{
189
- // Arrange
190
163
await PullIfNotExists ( _model ) ;
191
164
192
- // Act
193
165
var response = await _client . ShowModelAsync ( new ShowModelRequest { Model = _model } ) ;
194
166
195
- // Assert
196
167
response . Should ( ) . NotBeNull ( ) ;
197
168
response . Info . Should ( ) . NotBeNull ( ) ;
198
169
response . Info . Architecture . Should ( ) . Be ( "llama" ) ;
@@ -204,34 +175,28 @@ public async Task ShowModel()
204
175
[ Test ]
205
176
public async Task DeleteModel ( )
206
177
{
207
- // Arrange
208
178
await PullIfNotExists ( _localModel ) ;
209
179
await _client . CopyModelAsync ( new CopyModelRequest
210
180
{
211
181
Source = _localModel ,
212
182
Destination = $ "{ _localModel } -copy"
213
183
} ) ;
214
184
215
- var exists = ( await _client . ListLocalModelsAsync ( ) )
216
- . Any ( m => m . Name == $ "{ _localModel } -copy:latest") ;
185
+ var exists = ( await _client . ListLocalModelsAsync ( ) ) . Any ( m => m . Name == $ "{ _localModel } -copy:latest") ;
217
186
218
187
exists . Should ( ) . BeTrue ( ) ;
219
188
220
- // Act
221
189
await _client . DeleteModelAsync ( new DeleteModelRequest { Model = $ "{ _localModel } -copy:latest" } ) ;
222
190
223
- // Assert
224
191
var models = await _client . ListLocalModelsAsync ( ) ;
225
192
models . Should ( ) . NotContain ( m => m . Name == $ "{ _localModel } -copy:latest") ;
226
193
}
227
194
228
195
[ Test ]
229
196
public async Task GenerateAsync ( )
230
197
{
231
- // Arrange
232
198
await PullIfNotExists ( _model ) ;
233
199
234
- // Act
235
200
var response = await _client . GenerateAsync ( new GenerateRequest
236
201
{
237
202
Model = _model ,
@@ -242,18 +207,15 @@ public async Task GenerateAsync()
242
207
243
208
var joined = string . Join ( "" , response . Select ( r => r . Response ) ) ;
244
209
245
- // Assert
246
210
response . Should ( ) . NotBeEmpty ( ) ;
247
211
joined . Should ( ) . Contain ( "42" ) ;
248
212
}
249
213
250
214
[ Test ]
251
215
public async Task ChatAsync ( )
252
216
{
253
- // Arrange
254
217
await PullIfNotExists ( _model ) ;
255
218
256
- // Act
257
219
var response = await _client . ChatAsync ( new ChatRequest
258
220
{
259
221
Model = _model ,
@@ -280,28 +242,21 @@ public async Task ChatAsync()
280
242
281
243
var joined = string . Join ( "" , response . Select ( r => r . Message . Content ) ) ;
282
244
283
- // Assert
284
245
response . Should ( ) . NotBeEmpty ( ) ;
285
246
joined . Should ( ) . Contain ( "Douglas Adams" ) ;
286
247
}
287
248
288
249
[ Test ]
289
250
public async Task IsRunningAsync ( )
290
251
{
291
- // Act
292
252
var response = await _client . IsRunningAsync ( ) ;
293
-
294
- // Assert
295
253
response . Should ( ) . BeTrue ( ) ;
296
254
}
297
255
298
256
[ Test ]
299
257
public async Task GetVersionAsync ( )
300
258
{
301
- // Act
302
259
var response = await _client . GetVersionAsync ( ) ;
303
-
304
- // Assert
305
260
response . Should ( ) . NotBeNull ( ) ;
306
261
}
307
262
}
0 commit comments