Skip to content

Commit 67f49cb

Browse files
committed
fix(test) fix test after error / validation refactor
1 parent 09d099a commit 67f49cb

File tree

7 files changed

+92
-69
lines changed

7 files changed

+92
-69
lines changed

server/api/subscribe.post.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { getUserById } from "~/server/database/repositories/userRespository"
2-
import { getSubscribeUrl } from "~/server/services/stripeService"
2+
import { getSubscribeUrl } from "~/server/app/services/stripeService"
33
import { updateStripeCustomerId } from "~/server/database/repositories/userRespository"
44

55
export default defineEventHandler(async (event) => {

server/app/errors/responses/ZodErrorsResponse.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { H3Event } from "h3"
2-
import { getMappedZodErrors } from "~/server/app/helpers/errorMapper"
2+
import { getMappedZodErrors } from "../errorMapper"
33

44
export default async function sendZodErrorResponse(event: H3Event, errorData: any) {
55
const parsedErrors = getMappedZodErrors(errorData)

server/app/services/validator.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
import { RegistationRequest } from '~~/types/IRegistration';
2-
import { getUserByEmail, getUserByUserName } from '~/server/database/repositories/userRespository';
1+
import { getUserByEmail, getUserByUserName } from "~/server/database/repositories/userRespository"
2+
import { RegistationRequest } from "~/types/IRegistration"
3+
34

45
export async function validate(data: RegistationRequest) {
56

server/database/repositories/userRespository.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { User } from "@prisma/client";
22
import prisma from "~/server/database/client";
33
import { IUser } from '~/types/IUser';
4-
import { ISubscription } from "~~/types/ISubscription";
4+
import { ISubscription } from "~/types/ISubscription";
55

66
export async function getUserByEmail(emailOrEmail: string): Promise<User|null> {
77
return await prisma.user.findFirst({
@@ -15,7 +15,7 @@ export async function getUserByEmail(emailOrEmail: string): Promise<User|null> {
1515
})
1616
}
1717

18-
export async function getUserByUserName(username: string): Promise<IUser> {
18+
export async function getUserByUserName(username: string) {
1919
return await prisma.user.findUnique({
2020
where: {
2121
username: username,
@@ -41,7 +41,7 @@ export async function createUser(data: IUser) {
4141
return user
4242
}
4343

44-
export async function getUserById(id: number): Promise<IUser> {
44+
export async function getUserById(id: number) {
4545
return await prisma.user.findUnique({
4646
where: {
4747
id: id,
@@ -55,7 +55,7 @@ export async function getUserById(id: number): Promise<IUser> {
5555
})
5656
}
5757

58-
export async function getUserByStripeCustomerId(stripeCustomerId: string): Promise<IUser> {
58+
export async function getUserByStripeCustomerId(stripeCustomerId: string) {
5959
return await prisma.user.findFirst({
6060
where: {
6161
stripeCustomerId: stripeCustomerId,
@@ -69,7 +69,7 @@ export async function getUserByStripeCustomerId(stripeCustomerId: string): Promi
6969
})
7070
}
7171

72-
export async function getSubscriptionById(stripeId: string): Promise<ISubscription> {
72+
export async function getSubscriptionById(stripeId: string) {
7373
return await prisma.subscription.findFirst({
7474
where: {
7575
stripeId: stripeId,

server/middleware/serverAuth.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { H3Event } from "h3"
2-
import { authCheck } from "../services/userService"
2+
import { authCheck } from "~/server/app/services/userService"
33

44
export default eventHandler(async (event) => {
55

tests/feature/register.test.ts

+67-39
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
11
import { describe, expect, test, vi } from 'vitest'
22
import { setup, $fetch } from '@nuxt/test-utils-edge'
33
import { v4 as uuidv4 } from 'uuid'
4-
5-
6-
7-
// testing this way is neither fast or intuitive. Revisit when . . .
8-
// useFetch and other composeables are availble within this context
4+
import useErrorMapper from '../../composables/useErrorMapper'
95

106
describe('Test Registration', async () => {
117

@@ -20,66 +16,100 @@ describe('Test Registration', async () => {
2016
method: 'POST',
2117
responseType: 'json',
2218
body: {
23-
data: {
24-
username: 'testUsername',
25-
name: 'test_name',
26-
email: givenEmail,
27-
password: '12345678'
28-
}
19+
username: 'testUsername',
20+
name: 'test_name',
21+
email: givenEmail,
22+
password: '12345678'
2923
},
3024
}).catch(error => {
31-
const res = JSON.parse(error.data.data)
32-
33-
console.log('/////////////////////////////--->>>',res)
34-
const emailError: InputValidation = res.email.check
25+
const errorMap = useErrorMapper(error.data.data)
26+
expect(errorMap.hasErrors).toBe(true)
27+
expect(errorMap.errors.has('email')).toBe(true)
28+
expect(errorMap.errors.get('email')?.message).toBe('valid email required')
29+
expect(error.message).toContain(`422 Invalid Data Provided`)
3530

36-
expect(emailError.hasError).toBe(true)
37-
expect(error.message).toContain(`422 Unprocessable Entity`)
3831
})
3932
})
4033

4134
test('already used email returns error', async () => {
42-
const givenEmail = uuidv4().replaceAll('-', '') + '@fullstackjack.dev'
4335
const givenUsername2 = uuidv4().replaceAll('-', '')
4436
const givenUsername = uuidv4().replaceAll('-', '')
4537
const givenName = uuidv4().replaceAll('-', '')
4638
const givenName2 = uuidv4().replaceAll('-', '')
47-
39+
4840
await $fetch('/api/auth/register',
4941
{
5042
method: 'POST',
5143
responseType: 'json',
5244
body: {
53-
data: {
54-
username: givenUsername,
55-
name: givenName,
56-
57-
password: '12345678'
58-
}
45+
username: givenUsername,
46+
name: givenName,
47+
48+
password: '12345678'
5949
},
6050
}).catch(error => {
61-
console.log('EEEEEEE 2a >>>', error)
6251
})
6352

6453
await $fetch('/api/auth/register',
6554
{
6655
method: 'POST',
6756
responseType: 'json',
6857
body: {
69-
data: {
70-
username: givenUsername2,
71-
name: givenName2,
72-
73-
password: '12345678'
74-
}
58+
username: givenUsername2,
59+
name: givenName2,
60+
61+
password: '12345678'
7562
},
7663
}).catch(error => {
77-
console.log('EEEEEEE 2b >>>', error)
64+
const errorMap = useErrorMapper(error.data.data)
65+
expect(errorMap.hasErrors).toBe(true)
66+
expect(errorMap.errors.has('email')).toBe(true)
67+
expect(errorMap.errors.get('email')?.message).toBe('Email is invalid or already taken')
7868
expect(error.message).toContain(`422 Unprocessable Entity`)
7969
})
8070
})
8171

72+
8273
test('already used name returns error', async () => {
74+
const givenEmail = uuidv4().replaceAll('-', '') + '@fullstackjack.dev'
75+
const givenEmail2 = uuidv4().replaceAll('-', '') + '@fullstackjack.dev'
76+
const givenName = uuidv4().replaceAll('-', '')
77+
const givenName2 = uuidv4().replaceAll('-', '')
78+
79+
await $fetch('/api/auth/register',
80+
{
81+
method: 'POST',
82+
responseType: 'json',
83+
body: {
84+
username: 'duplicateUsername',
85+
name: givenName,
86+
email: givenEmail,
87+
password: '12345678'
88+
},
89+
}).catch(error => {
90+
})
91+
92+
await $fetch('/api/auth/register',
93+
{
94+
method: 'POST',
95+
responseType: 'json',
96+
body: {
97+
username: 'duplicateUsername',
98+
name: givenName2,
99+
email: givenEmail2,
100+
password: '12345678'
101+
},
102+
}).catch(error => {
103+
const errorMap = useErrorMapper(error.data.data)
104+
expect(errorMap.hasErrors).toBe(true)
105+
expect(errorMap.errors.has('username')).toBe(true)
106+
expect(errorMap.errors.get('username')?.message).toBe('Username is invalid or already taken')
107+
expect(error.message).toContain(`422 Unprocessable Entity`)
108+
})
109+
})
110+
111+
112+
test('vaild data registers new user', async () => {
83113
const givenEmail = uuidv4().replaceAll('-', '') + '@fullstackjack.dev'
84114
const givenUsername = uuidv4().replaceAll('-', '')
85115
const givenName = uuidv4().replaceAll('-', '')
@@ -89,12 +119,10 @@ describe('Test Registration', async () => {
89119
method: 'POST',
90120
responseType: 'json',
91121
body: {
92-
data: {
93-
username: givenUsername,
94-
name: givenName,
95-
email: givenEmail,
96-
password: '12345678'
97-
}
122+
username: givenUsername,
123+
name: givenName,
124+
email: givenEmail,
125+
password: '12345678'
98126
},
99127
}).then(res => {
100128
console.log('****** 3 >>>>> ', res)
+14-20
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,18 @@
11
import { describe, expect, it, vi } from 'vitest'
2-
import { validate } from '../../server/services/validator'
2+
import { getUserByUserName } from '~~/server/database/repositories/userRespository'
3+
import { validate } from '../../server/app/services/validator'
34

45

56
describe('test email validation', async () => {
7+
8+
vi.mock('~/server/database/repositories/userRespository', () => {
9+
return {
10+
getUserByEmail: vi.fn(() => ({ email: '[email protected]' })),
11+
getUserByUserName: vi.fn(() => ({ email: '[email protected]' }))
12+
}
13+
})
14+
15+
616
it('should return error if email missing', async () => {
717
const res = await validate({
818
username: '',
@@ -13,11 +23,8 @@ describe('test email validation', async () => {
1323

1424
const emailVal = res.get('email')
1525

16-
emailVal.check.errorMessage
17-
1826
expect(res.has('email')).toBe(true)
19-
expect(emailVal.check.hasError).toBe(true)
20-
expect(emailVal.check.errorMessage).toContain('email is required')
27+
expect(emailVal?.message).toContain('Email is invalid or already taken')
2128
})
2229

2330

@@ -31,21 +38,12 @@ describe('test email validation', async () => {
3138

3239
const emailVal = res.get('email')
3340

34-
emailVal.check.errorMessage
35-
3641
expect(res.has('email')).toBe(true)
37-
expect(emailVal.check.hasError).toBe(true)
38-
expect(emailVal.check.errorMessage).toContain('test, is not a valid email!')
42+
expect(emailVal?.message).toContain('Email is invalid or already taken')
3943
})
4044

4145
it('should return error if email taken', async () => {
4246

43-
vi.mock('~/server/database/repositories/userRespository', () => {
44-
return {
45-
getUserByEmail: vi.fn(() => ({ email: '[email protected]' }))
46-
}
47-
})
48-
4947
const email = '[email protected]'
5048

5149
const res = await validate({
@@ -57,11 +55,7 @@ describe('test email validation', async () => {
5755

5856
const emailVal = res.get('email')
5957

60-
emailVal.check.errorMessage
61-
6258
expect(res.has('email')).toBe(true)
63-
expect(emailVal.check.hasError).toBe(true)
64-
expect(emailVal.check.emailTaken).toBe(true)
65-
expect(emailVal.check.errorMessage).toContain(`This email, [email protected], is already registered!`)
59+
expect(emailVal?.message).toContain(`Email is invalid or already taken`)
6660
})
6761
})

0 commit comments

Comments
 (0)