Skip to content

Commit eff5048

Browse files
georgRusanovgeorgiy.rusanov
andauthored
chore(tests): added tests (#1061)
## What kind of change does this PR introduce? It increases test coverage --------- Co-authored-by: georgiy.rusanov <[email protected]>
1 parent 2aca0cb commit eff5048

File tree

6 files changed

+497
-13
lines changed

6 files changed

+497
-13
lines changed

infra/docker-compose.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ services:
6868
GOTRUE_SMTP_PASS: GOTRUE_SMTP_PASS
6969
GOTRUE_SMTP_ADMIN_EMAIL: [email protected]
7070
GOTRUE_COOKIE_KEY: 'sb'
71+
GOTRUE_EXTERNAL_ANONYMOUS_USERS_ENABLED: 'true'
7172
depends_on:
7273
- db
7374
restart: on-failure

test/GoTrueApi.test.ts

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ import {
1515

1616
import type { GenerateLinkProperties, User } from '../src/lib/types'
1717

18+
const INVALID_EMAIL = 'xx:;[email protected]'
19+
const INVALID_USER_ID = 'invalid-uuid'
20+
1821
describe('GoTrueAdminApi', () => {
1922
describe('User creation', () => {
2023
test('createUser() should create a new user', async () => {
@@ -78,6 +81,17 @@ describe('GoTrueAdminApi', () => {
7881
expect(data.user?.app_metadata).toHaveProperty('provider')
7982
expect(data.user?.app_metadata).toHaveProperty('providers')
8083
})
84+
85+
test('createUser() returns AuthError when email is invalid', async () => {
86+
const { error, data } = await serviceRoleApiClient.createUser({
87+
email: INVALID_EMAIL,
88+
password: 'password123',
89+
})
90+
91+
expect(error).not.toBeNull()
92+
expect(error?.message).toMatch('Unable to validate email address: invalid format')
93+
expect(data.user).toBeNull()
94+
})
8195
})
8296

8397
describe('User fetch', () => {
@@ -136,6 +150,13 @@ describe('GoTrueAdminApi', () => {
136150
expect(foundUser).not.toBeUndefined()
137151
expect(foundUser.user?.email).toEqual(email)
138152
})
153+
154+
test('getUserById() returns AuthError when user id is invalid', async () => {
155+
const { error, data } = await serviceRoleApiClient.getUserById(INVALID_USER_ID)
156+
157+
expect(error).not.toBeNull()
158+
expect(data.user).toBeNull()
159+
})
139160
})
140161

141162
describe('User updates', () => {
@@ -260,6 +281,13 @@ describe('GoTrueAdminApi', () => {
260281
expect(emails.length).toBeGreaterThan(0)
261282
expect(emails).not.toContain(email)
262283
})
284+
285+
test('deleteUser() returns AuthError when user id is invalid', async () => {
286+
const { error, data } = await serviceRoleApiClient.deleteUser(INVALID_USER_ID)
287+
288+
expect(error).not.toBeNull()
289+
expect(data.user).toBeNull()
290+
})
263291
})
264292

265293
describe('User registration', () => {
@@ -362,6 +390,27 @@ describe('GoTrueAdminApi', () => {
362390
expect(data.user).toHaveProperty('invited_at')
363391
expect(data.user?.invited_at).toBeDefined()
364392
})
393+
394+
test('inviteUserByEmail() returns AuthError when email is invalid', async () => {
395+
const { error, data } = await serviceRoleApiClient.inviteUserByEmail(INVALID_EMAIL)
396+
397+
expect(error).not.toBeNull()
398+
expect(error?.message).toMatch('Unable to validate email address: invalid format')
399+
expect(data.user).toBeNull()
400+
})
401+
402+
test('generateLink() returns AuthError when email is invalid', async () => {
403+
const { error, data } = await serviceRoleApiClient.generateLink({
404+
type: 'signup',
405+
email: INVALID_EMAIL,
406+
password: 'password123',
407+
})
408+
409+
expect(error).not.toBeNull()
410+
expect(error?.message).toMatch('Unable to validate email address: invalid format')
411+
expect(data.user).toBeNull()
412+
expect(data.properties).toBeNull()
413+
})
365414
})
366415

367416
describe('User authentication', () => {
@@ -425,4 +474,87 @@ describe('GoTrueAdminApi', () => {
425474
})
426475
})
427476
})
477+
478+
describe('List Users', () => {
479+
test('listUsers() returns AuthError when page is invalid', async () => {
480+
const { error, data } = await serviceRoleApiClient.listUsers({
481+
page: -1,
482+
perPage: 10
483+
})
484+
485+
expect(error).not.toBeNull()
486+
expect(data.users).toEqual([])
487+
})
488+
})
489+
490+
describe('Update User', () => {
491+
test('updateUserById() returns AuthError when user id is invalid', async () => {
492+
const { error, data } = await serviceRoleApiClient.updateUserById(INVALID_USER_ID, {
493+
494+
})
495+
496+
expect(error).not.toBeNull()
497+
expect(data.user).toBeNull()
498+
})
499+
})
500+
501+
describe('MFA Admin', () => {
502+
test('mfa factor management: add, list and delete', async () => {
503+
const { email, password } = mockUserCredentials()
504+
505+
const { error: signUpError, data: signUpData } = await authClientWithSession.signUp({
506+
email,
507+
password,
508+
})
509+
expect(signUpError).toBeNull()
510+
expect(signUpData.session).not.toBeNull()
511+
512+
const uid = signUpData.user?.id || ''
513+
expect(uid).toBeTruthy()
514+
515+
const { error: enrollError } = await authClientWithSession.mfa.enroll({
516+
factorType: 'totp'
517+
})
518+
expect(enrollError).toBeNull()
519+
520+
const { data, error } = await serviceRoleApiClient.mfa.listFactors({ userId: uid })
521+
522+
expect(error).toBeNull()
523+
expect(data).not.toBeNull()
524+
expect(Array.isArray(data?.factors)).toBe(true)
525+
expect(data?.factors.length).toBeGreaterThan(0)
526+
527+
const factorId = data?.factors[0].id
528+
expect(factorId).toBeDefined()
529+
const { data: deletedData, error: deletedError } = await serviceRoleApiClient.mfa.deleteFactor({
530+
userId: uid,
531+
id: factorId!
532+
})
533+
expect(deletedError).toBeNull()
534+
expect(deletedData).not.toBeNull()
535+
const deletedId = (deletedData as any)?.data?.id
536+
console.log('deletedId:', deletedId)
537+
expect(deletedId).toEqual(factorId)
538+
539+
const { data: latestData, error: latestError } = await serviceRoleApiClient.mfa.listFactors({ userId: uid })
540+
expect(latestError).toBeNull()
541+
expect(latestData).not.toBeNull()
542+
expect(Array.isArray(latestData?.factors)).toBe(true)
543+
expect(latestData?.factors.length).toEqual(0)
544+
})
545+
546+
547+
test('mfa.listFactors returns AuthError for invalid user', async () => {
548+
const { data, error } = await serviceRoleApiClient.mfa.listFactors({ userId: INVALID_USER_ID })
549+
expect(data).toBeNull()
550+
expect(error).not.toBeNull()
551+
})
552+
553+
test('mfa.deleteFactors returns AuthError for invalid user', async () => {
554+
const { data, error } = await serviceRoleApiClient.mfa.deleteFactor({ userId: INVALID_USER_ID , id: '1' })
555+
expect(data).toBeNull()
556+
expect(error).not.toBeNull()
557+
})
558+
559+
})
428560
})

0 commit comments

Comments
 (0)