1
1
import { db , privateDB } from "../../src/databases/databases" ;
2
- import { getHash } from "../../src/utils/getHash" ;
3
2
import assert from "assert" ;
4
3
import { client } from "../utils/httpClient" ;
4
+ import { UsernameUser , genAnonUser , genUsersUsername } from "../utils/genUser" ;
5
+ import { genRandomValue } from "../utils/getRandom" ;
5
6
6
- const adminPrivateUserID = "testUserId" ;
7
- const user00PrivateUserID = "setUsername_00" ;
8
- const username00 = "Username 00" ;
9
- const user01PrivateUserID = "setUsername_01" ;
10
- const username01 = "Username 01" ;
11
- const user02PrivateUserID = "setUsername_02" ;
12
- const username02 = "Username 02" ;
13
- const user03PrivateUserID = "setUsername_03" ;
14
- const username03 = "Username 03" ;
15
- const user04PrivateUserID = "setUsername_04" ;
16
- const username04 = "Username 04" ;
17
- const user05PrivateUserID = "setUsername_05" ;
18
- const username05 = "Username 05" ;
19
- const user06PrivateUserID = "setUsername_06" ;
20
- const username06 = "Username 06" ;
21
- const user07PrivateUserID = "setUsername_07" ;
22
- const username07 = "Username 07" ;
23
- const user08PrivateUserID = "setUsername_08" ;
24
-
25
- async function addUsername ( userID : string , userName : string , locked = 0 ) {
26
- await db . prepare ( "run" , 'INSERT INTO "userNames" ("userID", "userName", "locked") VALUES(?, ?, ?)' , [ userID , userName , locked ] ) ;
27
- await addLogUserNameChange ( userID , userName ) ;
7
+ const adminPrivateUserID = "testUserId" ; // hardcoded
8
+
9
+ const userMap = new Map ( ) ;
10
+ // generate usermap from 00 to 08
11
+ for ( let i = 0 ; i < 9 ; i ++ ) {
12
+ userMap . set ( `user_0${ i } ` , `username_0${ i } ` ) ;
28
13
}
29
14
30
- async function getUsernameInfo ( userID : string ) : Promise < { userName : string , locked : string } > {
31
- const row = await db . prepare ( "get" , 'SELECT "userName", "locked" FROM "userNames" WHERE "userID" = ?' , [ userID ] ) ;
15
+ const users = genUsersUsername ( "setUsername" , userMap ) ;
16
+
17
+ async function addUsername ( user : UsernameUser , locked = 0 ) {
18
+ await db . prepare ( "run" , 'INSERT INTO "userNames" ("userID", "userName", "locked") VALUES(?, ?, ?)' , [ user . pubID , user . username , locked ] ) ;
19
+ await addLogUserNameChange ( user . pubID , user . username ) ;
20
+ }
21
+
22
+ async function getUsernameInfo ( publicUserID : string ) : Promise < { userName : string , locked : string } > {
23
+ const row = await db . prepare ( "get" , 'SELECT "userName", "locked" FROM "userNames" WHERE "userID" = ?' , [ publicUserID ] ) ;
32
24
if ( ! row ) {
33
25
throw new Error ( "No username found" ) ;
34
26
}
35
27
return row ;
36
28
}
37
29
38
- function addLogUserNameChange ( userID : string , newUserName : string , oldUserName = "" ) {
30
+ function addLogUserNameChange ( publicUserID : string , newUserName : string , oldUserName = "" ) {
39
31
privateDB . prepare ( "run" ,
40
32
`INSERT INTO "userNameLogs"("userID", "newUserName", "oldUserName", "updatedAt", "updatedByAdmin") VALUES(?, ?, ?, ?, ?)` ,
41
- [ getHash ( userID ) , newUserName , oldUserName , new Date ( ) . getTime ( ) , + true ]
33
+ [ publicUserID , newUserName , oldUserName , new Date ( ) . getTime ( ) , + true ]
42
34
) ;
43
35
}
44
36
45
- function getLastLogUserNameChange ( userID : string ) {
46
- return privateDB . prepare ( "get" , `SELECT * FROM "userNameLogs" WHERE "userID" = ? ORDER BY "updatedAt" DESC LIMIT 1` , [ getHash ( userID ) ] ) ;
37
+ function getLastLogUserNameChange ( publicUserID : string ) {
38
+ return privateDB . prepare ( "get" , `SELECT * FROM "userNameLogs" WHERE "userID" = ? ORDER BY "updatedAt" DESC LIMIT 1` , [ publicUserID ] ) ;
47
39
}
48
40
49
41
function wellFormatUserName ( userName : string ) {
50
42
// eslint-disable-next-line no-control-regex
51
43
return userName . replace ( / [ \u0000 - \u001F \u007F - \u009F ] / g, "" ) ;
52
44
}
53
45
54
- async function testUserNameChangelog ( userID : string , newUserName : string , oldUserName : string , byAdmin : boolean , done : Mocha . Done ) {
55
- const log = await getLastLogUserNameChange ( userID ) ;
46
+ async function testUserNameChangelog ( publicUserID : string , newUserName : string , oldUserName : string , byAdmin : boolean , done : Mocha . Done ) {
47
+ const log = await getLastLogUserNameChange ( publicUserID ) ;
56
48
assert . strictEqual ( newUserName , log . newUserName ) ;
57
49
assert . strictEqual ( oldUserName , log . oldUserName ) ;
58
50
assert . strictEqual ( byAdmin , Boolean ( log . updatedByAdmin ) ) ;
59
51
return done ( ) ;
60
52
}
61
53
62
54
const endpoint = "/api/setUsername" ;
63
- const postSetUserName = ( userID : string , username : string ) => client ( {
55
+ const postSetUserName = ( privateUserID : string , username : string ) => client ( {
64
56
method : "POST" ,
65
57
url : endpoint ,
66
58
params : {
67
- userID,
59
+ userID : privateUserID ,
68
60
username,
69
61
}
70
62
} ) ;
@@ -81,33 +73,39 @@ const postSetUserNameAdmin = (userID: string, username: string, adminUserID: str
81
73
82
74
describe ( "setUsername" , ( ) => {
83
75
before ( async ( ) => {
84
- await addUsername ( getHash ( user01PrivateUserID ) , username01 , 0 ) ;
85
- await addUsername ( getHash ( user02PrivateUserID ) , username02 , 0 ) ;
86
- await addUsername ( getHash ( user03PrivateUserID ) , username03 , 0 ) ;
87
- await addUsername ( getHash ( user04PrivateUserID ) , username04 , 1 ) ;
88
- await addUsername ( getHash ( user05PrivateUserID ) , username05 , 0 ) ;
89
- await addUsername ( getHash ( user06PrivateUserID ) , username06 , 0 ) ;
90
- await addUsername ( getHash ( user07PrivateUserID ) , username07 , 1 ) ;
76
+ // skip user0
77
+ // add unlocked users
78
+ await addUsername ( users [ "user_01" ] , 0 ) ;
79
+ await addUsername ( users [ "user_02" ] , 0 ) ;
80
+ await addUsername ( users [ "user_03" ] , 0 ) ;
81
+ await addUsername ( users [ "user_05" ] , 0 ) ;
82
+ await addUsername ( users [ "user_06" ] , 0 ) ;
83
+ await addUsername ( users [ "user_08" ] , 0 ) ;
84
+ // add locked users
85
+ await addUsername ( users [ "user_04" ] , 1 ) ;
86
+ await addUsername ( users [ "user_07" ] , 1 ) ;
91
87
} ) ;
92
88
93
89
it ( "Should be able to set username that has never been set" , ( done ) => {
94
- postSetUserName ( user00PrivateUserID , username00 )
90
+ const user = users [ "user_00" ] ;
91
+ postSetUserName ( user . privID , user . username )
95
92
. then ( async res => {
96
- const usernameInfo = await getUsernameInfo ( getHash ( user00PrivateUserID ) ) ;
93
+ const usernameInfo = await getUsernameInfo ( user . pubID ) ;
97
94
assert . strictEqual ( res . status , 200 ) ;
98
- assert . strictEqual ( usernameInfo . userName , username00 ) ;
95
+ assert . strictEqual ( usernameInfo . userName , user . username ) ;
99
96
assert . notStrictEqual ( usernameInfo . locked , 1 , "username should not be locked" ) ;
100
97
done ( ) ;
101
98
} )
102
99
. catch ( ( err ) => done ( err ) ) ;
103
100
} ) ;
104
101
105
102
it ( "Should return 200" , ( done ) => {
106
- const username = "Changed%20Username" ;
107
- postSetUserName ( user01PrivateUserID , username )
103
+ const user = users [ "user_01" ] ;
104
+ const newUsername = genRandomValue ( "username" , "setUsername01" ) ;
105
+ postSetUserName ( user . privID , newUsername )
108
106
. then ( res => {
109
107
assert . strictEqual ( res . status , 200 ) ;
110
- testUserNameChangelog ( user01PrivateUserID , username , username01 , false , done ) ;
108
+ testUserNameChangelog ( user . pubID , newUsername , user . username , false , done ) ;
111
109
} )
112
110
. catch ( ( err ) => done ( err ) ) ;
113
111
} ) ;
@@ -143,8 +141,8 @@ describe("setUsername", () => {
143
141
} ) ;
144
142
145
143
it ( 'Should return 400 for "username" longer then 64 characters' , ( done ) => {
146
- const username65 = "0000000000000000000000000000000000000000000000000000000000000000X" ;
147
- postSetUserName ( "test" , username65 )
144
+ const username65 = "0" . repeat ( 65 ) ;
145
+ postSetUserName ( genAnonUser ( ) . privID , username65 )
148
146
. then ( res => {
149
147
assert . strictEqual ( res . status , 400 ) ;
150
148
done ( ) ;
@@ -154,10 +152,11 @@ describe("setUsername", () => {
154
152
155
153
it ( 'Should not change username if it contains "discord"' , ( done ) => {
156
154
const newUsername = "discord.me" ;
157
- postSetUserName ( user02PrivateUserID , newUsername )
155
+ const user = users [ "user_02" ] ;
156
+ postSetUserName ( user . privID , newUsername )
158
157
. then ( async res => {
159
158
assert . strictEqual ( res . status , 200 ) ;
160
- const userNameInfo = await getUsernameInfo ( getHash ( user02PrivateUserID ) ) ;
159
+ const userNameInfo = await getUsernameInfo ( user . pubID ) ;
161
160
assert . notStrictEqual ( userNameInfo . userName , newUsername ) ;
162
161
done ( ) ;
163
162
} )
@@ -166,21 +165,23 @@ describe("setUsername", () => {
166
165
167
166
it ( "Should be able to change username" , ( done ) => {
168
167
const newUsername = "newUsername" ;
169
- postSetUserName ( user03PrivateUserID , newUsername )
168
+ const user = users [ "user_03" ] ;
169
+ postSetUserName ( user . privID , newUsername )
170
170
. then ( async ( ) => {
171
- const usernameInfo = await getUsernameInfo ( getHash ( user03PrivateUserID ) ) ;
171
+ const usernameInfo = await getUsernameInfo ( user . pubID ) ;
172
172
assert . strictEqual ( usernameInfo . userName , newUsername , "Username should change" ) ;
173
173
assert . notStrictEqual ( usernameInfo . locked , 1 , "Username should not be locked" ) ;
174
- testUserNameChangelog ( user03PrivateUserID , newUsername , username03 , false , done ) ;
174
+ testUserNameChangelog ( user . pubID , newUsername , user . username , false , done ) ;
175
175
} )
176
176
. catch ( ( err ) => done ( err ) ) ;
177
177
} ) ;
178
178
179
179
it ( "Should not be able to change locked username" , ( done ) => {
180
180
const newUsername = "newUsername" ;
181
- postSetUserName ( user04PrivateUserID , newUsername )
181
+ const user = users [ "user_04" ] ;
182
+ postSetUserName ( user . privID , newUsername )
182
183
. then ( async ( ) => {
183
- const usernameInfo = await getUsernameInfo ( getHash ( user04PrivateUserID ) ) ;
184
+ const usernameInfo = await getUsernameInfo ( user . pubID ) ;
184
185
assert . notStrictEqual ( usernameInfo . userName , newUsername , "Username should not be changed" ) ;
185
186
assert . strictEqual ( usernameInfo . locked , 1 , "username should be locked" ) ;
186
187
done ( ) ;
@@ -190,18 +191,21 @@ describe("setUsername", () => {
190
191
191
192
it ( "Should filter out unicode control characters" , ( done ) => {
192
193
const newUsername = "This\nUsername+has\tInvalid+Characters" ;
193
- postSetUserName ( user05PrivateUserID , newUsername )
194
+ const user = users [ "user_05" ] ;
195
+ postSetUserName ( user . privID , newUsername )
194
196
. then ( async ( ) => {
195
- const usernameInfo = await getUsernameInfo ( getHash ( user05PrivateUserID ) ) ;
197
+ const usernameInfo = await getUsernameInfo ( user . pubID ) ;
196
198
assert . notStrictEqual ( usernameInfo . userName , newUsername , "Username should not contain control characters" ) ;
197
- testUserNameChangelog ( user05PrivateUserID , wellFormatUserName ( newUsername ) , username05 , false , done ) ;
199
+ testUserNameChangelog ( user . pubID , wellFormatUserName ( newUsername ) , user . username , false , done ) ;
198
200
} )
199
201
. catch ( ( err ) => done ( err ) ) ;
200
202
} ) ;
201
203
202
204
it ( "Incorrect adminUserID should return 403" , ( done ) => {
203
205
const newUsername = "New Username" ;
204
- postSetUserNameAdmin ( getHash ( user06PrivateUserID ) , newUsername , "invalidAdminID" )
206
+ const user = users [ "user_06" ] ;
207
+ const adminID = genRandomValue ( "adminID" , "setUsername06" ) ;
208
+ postSetUserNameAdmin ( user . pubID , newUsername , adminID )
205
209
. then ( res => {
206
210
assert . strictEqual ( res . status , 403 ) ;
207
211
done ( ) ;
@@ -211,34 +215,36 @@ describe("setUsername", () => {
211
215
212
216
it ( "Admin should be able to change username" , ( done ) => {
213
217
const newUsername = "New Username" ;
214
- postSetUserNameAdmin ( getHash ( user06PrivateUserID ) , newUsername , adminPrivateUserID )
218
+ const user = users [ "user_06" ] ;
219
+ postSetUserNameAdmin ( user . pubID , newUsername , adminPrivateUserID )
215
220
. then ( async ( ) => {
216
- const usernameInfo = await getUsernameInfo ( getHash ( user06PrivateUserID ) ) ;
221
+ const usernameInfo = await getUsernameInfo ( user . pubID ) ;
217
222
assert . strictEqual ( usernameInfo . userName , newUsername , "username should be changed" ) ;
218
223
assert . strictEqual ( usernameInfo . locked , 1 , "Username should be locked" ) ;
219
- testUserNameChangelog ( user06PrivateUserID , newUsername , username06 , true , done ) ;
224
+ testUserNameChangelog ( user . pubID , newUsername , user . username , true , done ) ;
220
225
} )
221
226
. catch ( ( err ) => done ( err ) ) ;
222
227
} ) ;
223
228
224
229
it ( "Admin should be able to change locked username" , ( done ) => {
225
230
const newUsername = "New Username" ;
226
- postSetUserNameAdmin ( getHash ( user07PrivateUserID ) , newUsername , adminPrivateUserID )
231
+ const user = users [ "user_07" ] ;
232
+ postSetUserNameAdmin ( user . pubID , newUsername , adminPrivateUserID )
227
233
. then ( async ( ) => {
228
- const usernameInfo = await getUsernameInfo ( getHash ( user06PrivateUserID ) ) ;
234
+ const usernameInfo = await getUsernameInfo ( user . pubID ) ;
229
235
assert . strictEqual ( usernameInfo . userName , newUsername , "Username should be changed" ) ;
230
236
assert . strictEqual ( usernameInfo . locked , 1 , "Username should be locked" ) ;
231
- testUserNameChangelog ( user07PrivateUserID , newUsername , username07 , true , done ) ;
237
+ testUserNameChangelog ( user . pubID , newUsername , user . username , true , done ) ;
232
238
} )
233
239
. catch ( ( err ) => done ( err ) ) ;
234
240
} ) ;
235
241
236
242
it ( "Should delete row if new username is same as publicID" , ( done ) => {
237
- const publicID = getHash ( user08PrivateUserID ) ;
238
- postSetUserName ( getHash ( user08PrivateUserID ) , publicID )
243
+ const user = users [ "user_08" ] ;
244
+ postSetUserName ( user . privID , user . pubID )
239
245
. then ( ( ) => {
240
- getUsernameInfo ( getHash ( user08PrivateUserID ) )
241
- . then ( usernameinfo => done ( `Username should be deleted - ${ usernameinfo } )` ) )
246
+ getUsernameInfo ( user . pubID )
247
+ . then ( usernameinfo => done ( `Username should be deleted - ${ JSON . stringify ( usernameinfo ) } )` ) )
242
248
. catch ( ( ) => done ( ) ) ;
243
249
} )
244
250
. catch ( ( err ) => done ( err ) ) ;
0 commit comments