Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Avatar for KuCalc : devops.
Download
50671 views
1
###
2
TESTING of cursors table
3
4
COPYRIGHT : (c) 2017 SageMath, Inc.
5
LICENSE : AGPLv3
6
###
7
8
async = require('async')
9
expect = require('expect')
10
11
pgtest = require('./pgtest')
12
db = undefined
13
setup = (cb) -> (pgtest.setup (err) -> db=pgtest.db; cb(err))
14
teardown = pgtest.teardown
15
16
{create_accounts, create_projects, changefeed_series} = pgtest
17
misc = require('smc-util/misc')
18
19
t = (misc.minutes_ago(10-i) for i in [0...10])
20
21
describe 'basic use of cursors table -- ', ->
22
before(setup)
23
after(teardown)
24
25
accounts = projects = string_id = undefined
26
path = 'a.txt'
27
it 'creates 1 accounts', (done) ->
28
create_accounts 1, (err, x) -> accounts=x; done(err)
29
it 'creates 1 projects', (done) ->
30
create_projects 1, accounts[0], (err, x) -> projects=x; done(err)
31
it 'creates a syncstring', (done) ->
32
string_id = db.sha1(projects[0], path)
33
db.user_query
34
account_id : accounts[0]
35
query : {syncstrings:{project_id:projects[0], path:path, users:accounts}}
36
cb : done
37
38
it 'user creates a cursor entry', (done) ->
39
db.user_query
40
account_id : accounts[0]
41
query : {cursors:{string_id:string_id, user_id:0, time:t[0], locs:[{x:1, y:2}, {x:5,y:3}]}}
42
cb : done
43
44
it 'reads back the cursor entry', (done) ->
45
db.user_query
46
account_id : accounts[0]
47
query : {cursors:{string_id:string_id, user_id:0, time:null, locs:null}}
48
cb : (err, x) ->
49
expect(x).toEqual(cursors:{string_id:string_id, user_id:0, time:t[0], locs:[{x:1, y:2}, {x:5,y:3}]})
50
done(err)
51
52
it 'creates another cursor entry', (done) ->
53
db.user_query
54
account_id : accounts[0]
55
query : {cursors:{string_id:string_id, user_id:1, time:t[1], locs:[{x:10, y:25}]}}
56
cb : done
57
58
it 'reads back all cursors for the given document', (done) ->
59
db.user_query
60
account_id : accounts[0]
61
query : {cursors:[{string_id:string_id, user_id:null, time:null, locs:null}]}
62
options : [order_by:'time']
63
cb : (err, x) ->
64
expect(x).toEqual(cursors:[{string_id:string_id, user_id:0, time:t[0], locs:[{x:1, y:2}, {x:5,y:3}]},
65
{string_id:string_id, user_id:1, time:t[1], locs:[{x:10, y:25}]}
66
])
67
done(err)
68
69
it 'reads back recent cursors for the given document', (done) ->
70
db.user_query
71
account_id : accounts[0]
72
query : {cursors:[{string_id:string_id, user_id:null, time:{'>=':t[1]}, locs:null}]}
73
options : [order_by:'time']
74
cb : (err, x) ->
75
expect(x).toEqual(cursors:[{string_id:string_id, user_id:1, time:t[1], locs:[{x:10, y:25}]}])
76
done(err)
77
78
it 'changes a cursor position', (done) ->
79
db.user_query
80
account_id : accounts[0]
81
query : {cursors:{string_id:string_id, user_id:1, time:t[1], locs:[{x:3, y:15}]}}
82
cb : done
83
84
it 'verifies the change', (done) ->
85
db.user_query
86
account_id : accounts[0]
87
query : {cursors:{string_id:string_id, user_id:null, time:t[1], locs:null}}
88
cb : (err, x) ->
89
expect(x).toEqual(cursors:{string_id:string_id, user_id:1, time:t[1], locs:[{x:3, y:15}]})
90
done(err)
91
92
93
describe 'access control tests on cursors table -- ', ->
94
before(setup)
95
after(teardown)
96
97
# SETUP
98
accounts = projects = string_id = undefined
99
path = 'a.txt'
100
it 'creates 3 accounts', (done) ->
101
create_accounts 3, (err, x) -> accounts=x; done(err)
102
it 'creates 2 projects', (done) ->
103
create_projects 2, accounts[0], (err, x) -> projects=x; done(err)
104
it 'creates a syncstring', (done) ->
105
string_id = db.sha1(projects[0], path)
106
db.user_query
107
account_id : accounts[0]
108
query : {syncstrings:{project_id:projects[0], path:path, users:accounts}}
109
cb : done
110
111
it 'user creates a cursor entry', (done) ->
112
db.user_query
113
account_id : accounts[0]
114
query : {cursors:{string_id:string_id, user_id:0, time:t[0], locs:[{x:1, y:2}]}}
115
cb : done
116
117
it 'reads back the cursor entry', (done) ->
118
db.user_query
119
account_id : accounts[0]
120
query : {cursors:{string_id:string_id, user_id:0, time:null, locs:null}}
121
cb : (err, x) ->
122
expect(x).toEqual(cursors:{string_id:string_id, user_id:0, time:t[0], locs:[{x:1, y:2}]})
123
done(err)
124
125
it 'fails to reads back as project (since no project access to cursors table!)', (done) ->
126
db.user_query
127
project_id : projects[0]
128
query : {cursors:{string_id:string_id, user_id:0, time:t[0], locs:null}}
129
cb : (err, x) ->
130
expect(err).toEqual("get queries not allowed for table 'cursors'")
131
done()
132
133
it 'fails to reads back as user not on project', (done) ->
134
db.user_query
135
account_id : accounts[1]
136
query : {cursors:{string_id:string_id, user_id:0, time:t[0], locs:null}}
137
cb : (err, x) ->
138
expect(err).toEqual("user must be an admin")
139
done()
140
141
it 'tries to read as anon and fails', (done) ->
142
db.user_query
143
query : {cursors:{string_id:string_id, time:t[0], user_id:0, locs:null}}
144
cb : (err) ->
145
expect(err).toEqual("anonymous get queries not allowed for table 'cursors'")
146
done()
147
148
it 'tries to write as anon and fails', (done) ->
149
db.user_query
150
query : {cursors:{string_id:string_id, time:new Date(), user_id:0, locs:[{x:1, y:2}]}}
151
cb : (err) ->
152
expect(err).toEqual("no anonymous set queries")
153
done()
154
155
it 'tries to write as user not on the project and fails', (done) ->
156
db.user_query
157
account_id : accounts[1]
158
query : {cursors:{string_id:string_id, time:t[1], user_id:0, locs:null}}
159
cb : (err) ->
160
expect(err).toEqual("user must be an admin")
161
done()
162
163
it 'tries to write as different project and fails', (done) ->
164
db.user_query
165
project_id : projects[1]
166
query : {cursors:{string_id:string_id, time:t[1], user_id:0, locs:[{x:5,y:10}]}}
167
cb : (err) ->
168
expect(err).toEqual("user set queries not allowed for table 'cursors'")
169
done()
170
171
it 'makes account1 an admin', (done) ->
172
db.make_user_admin(account_id:accounts[1], cb:done)
173
174
it 'tries to write as admin user and succeeds', (done) ->
175
db.user_query
176
account_id : accounts[1]
177
query : {cursors:{string_id:string_id, time:t[5], user_id:0, locs:[{x:5,y:10}]}}
178
cb : done
179
180
it 'try to read as admin and succeed', (done) ->
181
db.user_query
182
account_id : accounts[1]
183
query : {cursors:{string_id:string_id, user_id:0, time:t[0], locs:null}}
184
cb : done
185
186
it 'makes account2 a collab', (done) ->
187
db.add_user_to_project(project_id:projects[0], account_id:accounts[2], cb:done)
188
189
it 'tries to write as collab and succeeds', (done) ->
190
db.user_query
191
account_id : accounts[2]
192
query : {cursors:{string_id:string_id, time:t[2], user_id:1, locs:[{x:15,y:20}]}}
193
cb : done
194
195
it 'try to read as collab and succeed', (done) ->
196
db.user_query
197
account_id : accounts[2]
198
query : {cursors:{string_id:string_id, user_id:0, time:t[0], locs:null}}
199
cb : done
200
201
it 'tries to write as same project and fails', (done) ->
202
db.user_query
203
project_id : projects[0]
204
query : {cursors:{string_id:string_id, time:t[3], user_id:2, locs:[{x:20,y:25}]}}
205
cb : (err) ->
206
expect(err).toEqual("user set queries not allowed for table 'cursors'")
207
done()
208
209
it 'tries to write non-array locs and fail', (done) ->
210
db.user_query
211
account_id : accounts[0]
212
query : {cursors:{string_id:string_id, time:t[4], user_id:0, locs:'foo bar'}}
213
cb : (err) ->
214
expect(err).toContain('malformed array literal')
215
done()
216
217
it 'tries to write invalid string_id and fails', (done) ->
218
db.user_query
219
account_id : accounts[0]
220
query : {cursors:{string_id:'sage', time:t[4], user_id:2, locs:[{x:20,y:25}]}}
221
cb : (err) ->
222
expect(err).toEqual("string_id (='sage') must be a string of length 40")
223
done()
224
225
it 'tries to write with missing locs and fail', (done) ->
226
db.user_query
227
account_id : accounts[0]
228
query : {cursors:{string_id:string_id, time:t[4], user_id:2}}
229
cb : (err) ->
230
expect(err).toContain('violates not-null constraint')
231
done()
232
233
it 'tries to write invalid time and fails', (done) ->
234
db.user_query
235
account_id : accounts[0]
236
query : {cursors:{string_id:string_id, time:'sage', user_id:2, locs:[{x:20,y:25}]}}
237
cb : (err) ->
238
expect(err).toContain('invalid input syntax for type timestamp')
239
done()
240
241
describe 'changefeed tests on cursors table', ->
242
before(setup)
243
after(teardown)
244
245
accounts = projects = string_id = undefined
246
path = 'a.txt'
247
t = (misc.minutes_ago(10-i) for i in [0...10])
248
patch0 = misc.to_json({a:'patch'})
249
it 'creates 2 accounts', (done) ->
250
create_accounts 2, (err, x) -> accounts=x; done(err)
251
it 'creates 1 projects', (done) ->
252
create_projects 1, accounts[0], (err, x) -> projects=x; done(err)
253
it 'creates a syncstring', (done) ->
254
string_id = db.sha1(projects[0], path)
255
db.user_query
256
account_id : accounts[0]
257
query : {syncstrings:{project_id:projects[0], path:path, users:accounts}}
258
cb : done
259
it 'adds other user to project', (done) ->
260
db.add_user_to_project(account_id: accounts[1], project_id:projects[0], cb:done)
261
262
it 'creates a changefeed as user', (done) ->
263
changefeed_id = misc.uuid()
264
db.user_query
265
account_id : accounts[0]
266
query : {cursors:[{string_id:string_id, time:null, user_id:null, locs:null}]}
267
changes : changefeed_id
268
cb : changefeed_series([
269
(x, cb) ->
270
expect(x?.cursors?.length).toEqual(0)
271
272
# insert a new cursor
273
db.user_query
274
account_id : accounts[0]
275
query : {cursors:{string_id:string_id, time:t[0], user_id:0, locs:[{x:1,y:2}]}}
276
cb : cb
277
(x, cb) ->
278
expect(x).toEqual({action:'insert', new_val:{string_id:string_id, time:t[0], user_id:0, locs:[{x:1,y:2}]}})
279
280
# insert another cursor
281
db.user_query
282
account_id : accounts[1]
283
query : {cursors:{string_id:string_id, time:t[1], user_id:1, locs:[{x:5,y:10}, {x:3,y:5}]}}
284
cb : cb
285
(x, cb) ->
286
expect(x).toEqual({action:'insert', new_val:{string_id:string_id, time:t[1], user_id:1, locs:[{x:5,y:10}, {x:3,y:5}]}})
287
288
# move cursor
289
db.user_query
290
account_id : accounts[0]
291
query : {cursors:{string_id:string_id, user_id:0, time:t[2], locs:[{x:10,y:20}]}}
292
cb : cb
293
(x, cb) ->
294
expect(x).toEqual({action:'update', new_val:{string_id:string_id, user_id:0, time:t[2], locs:[{x:10,y:20}]}})
295
296
# delete cursor
297
db._query
298
query : "DELETE FROM cursors"
299
where :
300
string_id : string_id
301
user_id : 0
302
cb : cb
303
(x, cb) ->
304
expect(x).toEqual({action:'delete', old_val:{string_id:string_id, user_id:0}})
305
306
db.user_query_cancel_changefeed(id:changefeed_id, cb:cb)
307
(x, cb) ->
308
expect(x).toEqual({action:'close'})
309
cb()
310
], done)
311