Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Avatar for KuCalc : devops.
Download
50651 views
1
###
2
Simplest possible interesting test.
3
###
4
5
6
init = require('./init')
7
db = undefined
8
setup = (cb) -> (init.setup (err) -> db=init.db(); cb(err))
9
teardown = init.teardown
10
11
async = require('async')
12
expect = require('expect')
13
14
misc = require('smc-util/misc')
15
16
wait = (project, cb) ->
17
project.once 'change', ->
18
cb?()
19
(err) ->
20
if err
21
cb(err)
22
cb = undefined
23
24
describe 'creating compute client -- ', ->
25
@timeout(5000)
26
before(setup)
27
after(teardown)
28
29
it 'creates compute client', ->
30
client = init.compute_client()
31
32
it 'but with no database', ->
33
try
34
require('../../kucalc/compute-client').compute_client()
35
catch
36
# success -- there should be an exception
37
return
38
throw Error("there should be an exception")
39
40
describe 'test basic foundations of project client -- ', ->
41
@timeout(5000)
42
before(setup)
43
after(teardown)
44
45
client = undefined
46
it 'creates compute client', ->
47
client = init.compute_client()
48
49
account_id = undefined
50
it 'creates an account', (done) ->
51
db.create_account(first_name:"Sage", last_name:"Math", created_by:"1.2.3.4",\
52
email_address:"[email protected]", \
53
password_hash:"blah", cb:(err, x) -> account_id=x; done(err))
54
55
project_id = undefined
56
it 'creates a project', (done) ->
57
db.create_project(account_id:account_id, title:"Test project", description:"The description",\
58
cb:(err, x) -> project_id=x; done(err))
59
60
project = undefined
61
it 'creates compute client project object', (done) ->
62
client.project(project_id: project_id, cb: (err, x) ->
63
project = x; done(err))
64
65
it 'confirm the host is correct', ->
66
expect(project.host).toBe("project-#{project_id}")
67
68
it 'confirms nothing is set yet in the synctable', ->
69
expect(project.get().toJS()).toEqual({project_id:project_id})
70
71
it 'gets unitialized state', (done) ->
72
project.state
73
cb : (err, state) ->
74
expect(state).toBe(undefined)
75
done(err)
76
77
state = undefined
78
it 'sets the state', (done) ->
79
state = {state:'closed', time:new Date()}
80
project._query
81
jsonb_set : {state : state}
82
cb : wait(project, done)
83
84
it 'confirms state is set as required synctable', (done) ->
85
project.state
86
cb : (err, state) ->
87
expect(state).toEqual(state)
88
done(err)
89
90
it 'get the default status', (done) ->
91
project.status
92
cb : (err, status) ->
93
expect(status).toEqual({ 'console_server.port': 6003, 'local_hub.port': 6000, 'raw.port': 6001, 'sage_server.port': 6002 })
94
done(err)
95
96
it 'add some info to the status', (done) ->
97
project._query
98
jsonb_merge : {status:{secret_token:'top-secret'}}
99
cb : wait(project, done)
100
101
it 'verify the secret is in the status', (done) ->
102
project.status
103
cb : (err, status) ->
104
expect(status.secret_token).toBe('top-secret')
105
done(err)
106
107
it 'get address of project', (done) ->
108
project.address
109
cb : (err, address) ->
110
expect(err).toBe(undefined)
111
expect(address).toEqual({ host: "project-#{project_id}", port: 6000, secret_token: 'top-secret' })
112
done()
113
114
it 'close the project client and verifies that host is no longer defined ', ->
115
project.close()
116
expect(project.host).toBe(undefined)
117
118
119
describe 'test the lifecyle of project client (mocking the manager) -- ', ->
120
@timeout(5000)
121
before(setup)
122
after(teardown)
123
124
client = account_id = project_id = project = undefined
125
it 'creates client, account and project', (done) ->
126
client = init.compute_client()
127
async.series([
128
(cb) -> db.create_account(first_name:"Sage", last_name:"Math", created_by:"1.2.3.4",\
129
email_address:"[email protected]", \
130
password_hash:"blah", cb:(err, x) -> account_id=x; cb(err))
131
(cb) -> db.create_project(account_id:account_id, title:"Test project", description:"The description",\
132
cb:(err, x) -> project_id=x; cb(err))
133
(cb) -> client.project(project_id: project_id, cb: (err, x) ->
134
project = x; cb(err))
135
], done)
136
137
it 'opens the project', (done) ->
138
# start project opening
139
project.open
140
cb : (err) ->
141
x = project._action_request()
142
expect((new Date() - x.finished) < 500).toBe(true)
143
done(err)
144
# all that did was change the db, which we confirm now
145
project.once 'change', ->
146
x = project._action_request()
147
expect(x.action).toBe('open')
148
expect((new Date() - x.started) < 500).toBe(true)
149
expect(x.finished).toBe(undefined)
150
# Now set the state to opened; this is what the project manager will do....
151
project._query
152
jsonb_merge :
153
state : {state:'opened', time:new Date()}
154
action_request : {finished:new Date()}
155
cb : (err) ->
156
expect(!!err).toBe(false)
157
# this will trigger the callback of project.open above
158
159
it 'start the project running', (done) ->
160
project.start
161
cb : (err) ->
162
x = project._action_request()
163
expect((new Date() - x.finished) < 500).toBe(true)
164
done(err)
165
project.once 'change', ->
166
x = project._action_request()
167
expect(x.action).toBe('start')
168
expect((new Date() - x.started) < 500).toBe(true)
169
expect(x.finished).toBe(undefined)
170
project._query
171
jsonb_merge :
172
state : {state:'running', time:new Date(), error:undefined}
173
action_request : {finished:new Date()}
174
cb : (err) ->
175
expect(!!err).toBe(false)
176
177
it 'stop the project', (done) ->
178
project.stop
179
cb : done
180
project.once 'change', ->
181
x = project._action_request()
182
expect(x.action).toBe('stop')
183
project._query
184
jsonb_merge :
185
state : {state:'opened', time:new Date(), error:undefined}
186
action_request : {finished:new Date()}
187
cb : (err) ->
188
expect(!!err).toBe(false)
189
190
it 'start the project again', (done) ->
191
project.start
192
cb : done
193
project.once 'change', ->
194
project._query
195
jsonb_merge :
196
state : {state:'running', time:new Date(), error:undefined}
197
action_request : {finished:new Date()}
198
cb : (err) ->
199
expect(!!err).toBe(false)
200
201
it 'restart the project', (done) ->
202
project.restart
203
cb : done
204
# NOW mock --
205
project.once 'change', ->
206
# first stop it.
207
project._query
208
jsonb_merge :
209
state : {state:'opened', time:new Date(), error:undefined}
210
action_request : {finished:new Date()}
211
cb : (err) ->
212
expect(!!err).toBe(false)
213
# then start it back up.
214
project.once 'change', ->
215
project._query
216
jsonb_merge :
217
state : {state:'running', time:new Date(), error:undefined}
218
action_request : {finished:new Date()}
219
cb : (err) ->
220
expect(!!err).toBe(false)
221
222
it 'close the project (means moving it to longterm storage)', (done) ->
223
project.ensure_closed
224
cb : done
225
project.once 'change', ->
226
project._query
227
jsonb_merge :
228
state : {state:'closed', time:new Date(), error:undefined}
229
action_request : {finished:new Date()}
230
cb : (err) ->
231
expect(!!err).toBe(false)
232
233
it 'move gives an error', (done) ->
234
project.move
235
cb : (err) ->
236
expect(err).toBe("move makes no sense for Kubernetes")
237
done()
238
239
240
it 'close the project client (i.e., free up usage)', ->
241
project.close()
242
expect(project.synctable).toBe(undefined)
243
244
245
246
247
248
249
250
251
252