@@ -142,7 +142,7 @@ describe('Member Storage Controller', () => {
142142 expect ( response . statusCode ) . toBe ( StatusCodes . NO_CONTENT ) ;
143143 await waitForExpect ( ( ) => {
144144 expect ( mockSendEmail ) . toHaveBeenCalledTimes ( 1 ) ;
145- expect ( mockSendEmail . mock . calls [ 0 ] [ 1 ] ) . toBe ( email ) ;
145+ expect ( mockSendEmail . mock . calls [ 0 ] [ 1 ] ) . toBe ( email . toLowerCase ( ) ) ;
146146 expect ( mockSendEmail . mock . calls [ 0 ] [ 2 ] ) . toContain ( 'email/change?t=' ) ;
147147 } ) ;
148148
@@ -263,6 +263,32 @@ describe('Member Storage Controller', () => {
263263 // mock send email only sent once, before
264264 expect ( mockSendEmail ) . toHaveBeenCalledTimes ( 1 ) ;
265265 } ) ;
266+ // regression test for issue #1939
267+ it ( 'Change email and store as lowercase' , async ( ) => {
268+ const { actor } = await seedFromJson ( ) ;
269+ assertIsDefined ( actor ) ;
270+ assertIsMember ( actor ) ;
271+ mockAuthenticate ( actor ) ;
272+
273+ // specifically use an uppercase email
274+ const newEmail = faker . internet . email ( ) . toUpperCase ( ) ;
275+ const token = jwtSign (
276+ { uuid : actor . id , oldEmail : actor . email , newEmail } ,
277+ EMAIL_CHANGE_JWT_SECRET ,
278+ ) ;
279+
280+ const response = await app . inject ( {
281+ method : HttpMethod . Patch ,
282+ url : '/members/current/email/change' ,
283+ headers : { Authorization : `Bearer ${ token } ` } ,
284+ } ) ;
285+ expect ( response . statusCode ) . toBe ( StatusCodes . NO_CONTENT ) ;
286+ // Email changed
287+ const rawMember = await db . query . accountsTable . findFirst ( {
288+ where : eq ( accountsTable . id , actor . id ) ,
289+ } ) ;
290+ expect ( rawMember ?. email ) . toEqual ( newEmail . toLowerCase ( ) ) ;
291+ } ) ;
266292 } ) ;
267293 describe ( 'GET /members/current/storage/files' , ( ) => {
268294 it ( 'returns ok' , async ( ) => {
0 commit comments