Skip to content

Commit

Permalink
Merge pull request #6 from fumeapp/more-tests
Browse files Browse the repository at this point in the history
✨ complete user cartridge coverage
  • Loading branch information
acidjazz authored Aug 22, 2024
2 parents 34f3d88 + 3079ab5 commit ea4f27d
Show file tree
Hide file tree
Showing 26 changed files with 1,087 additions and 960 deletions.
2 changes: 0 additions & 2 deletions app/app.vue
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@
const colorMode = useColorMode()
const color = computed(() => colorMode.value === 'dark' ? '#111827' : 'white')
console.log('we are in app.vue')
useHead({
meta: [
{ charset: 'utf-8' },
Expand Down
2 changes: 1 addition & 1 deletion app/pages/users/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ const columns = [
},
]
const { data: users } = await useFetch<MetapiResponse<User>>('/api/user')
const { data: users } = await useFetch<MetapiResponse<User>>('/api/users')
</script>

<template>
Expand Down
2 changes: 2 additions & 0 deletions app/utils/shared.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,3 +57,5 @@ export const shotUnits = [
25,
50,
]

export const sleep = (ms: number) => new Promise(resolve => setTimeout(resolve, ms))
8 changes: 7 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
"preview": "nuxt preview",
"test": "vitest run",
"test:dev": "DEVRUN=true vitest run",
"test:dev:ui": "DEVRUN=true vitest --ui",
"test:reset": "pnpm run db:test:reset; vitest run",
"test:dev:reset": "pnpm run db:test:reset; DEVRUN=true vitest run",
"db:test:reset": "dotenv -e .env.test -- npx prisma migrate reset --force",
Expand All @@ -20,7 +21,8 @@
},
"dependencies": {
"@nuxt/ui-pro": "^1.4.1",
"date-fns": "^3.6.0"
"date-fns": "^3.6.0",
"h3": "npm:h3-nightly@latest"
},
"devDependencies": {
"@antfu/eslint-config": "^2.26.0",
Expand All @@ -35,6 +37,7 @@
"@prisma/nuxt": "^0.0.35",
"@types/ua-parser-js": "^0.7.39",
"@vitest/coverage-v8": "^2.0.5",
"@vitest/ui": "^2.0.5",
"dotenv-cli": "^7.4.2",
"happy-dom": "^14.12.3",
"nuxt": "^3.12.4",
Expand All @@ -43,5 +46,8 @@
"ua-parser-js": "^1.0.38",
"vitest": "^2.0.5",
"zod": "^3.23.8"
},
"resolutions": {
"h3": "npm:h3-nightly@latest"
}
}
1,427 changes: 681 additions & 746 deletions pnpm-lock.yaml

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ CREATE TABLE `shots` (
`userId` BIGINT NOT NULL,
`cartridgeId` BIGINT NOT NULL,
`units` INTEGER NOT NULL,
`date` DATE NOT NULL,
`date` DATETIME(3) NOT NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,

Expand Down
50 changes: 26 additions & 24 deletions prisma/schema/meds.prisma
Original file line number Diff line number Diff line change
@@ -1,39 +1,41 @@

model Cartridge {
id BigInt @id @default(autoincrement())
id BigInt @id @default(autoincrement())
userId BigInt
user User @relation(fields: [userId], references: [id])
content String
ml Decimal
mg Decimal
shots Shot[]
pen Pen?
user User @relation(fields: [userId], references: [id])
content String
ml Decimal
mg Decimal
shots Shot[]
pen Pen?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("cartridges")
}

model Pen {
id BigInt @id @default(autoincrement())
user User @relation(fields: [userId], references: [id])
userId BigInt
cartridge Cartridge? @relation(fields: [cartridgeId], references: [id], onDelete: Restrict )
cartridgeId BigInt? @unique
color String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
id BigInt @id @default(autoincrement())
user User @relation(fields: [userId], references: [id])
userId BigInt
cartridge Cartridge? @relation(fields: [cartridgeId], references: [id], onDelete: Restrict)
cartridgeId BigInt? @unique
color String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("pens")
}

model Shot {
id BigInt @id @default(autoincrement())
userId BigInt
user User @relation(fields: [userId], references: [id])
id BigInt @id @default(autoincrement())
userId BigInt
user User @relation(fields: [userId], references: [id])
cartridgeId BigInt
cartridge Cartridge @relation(fields: [cartridgeId], references: [id], onDelete: Cascade, onUpdate: Cascade )
units Int
date DateTime
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
cartridge Cartridge @relation(fields: [cartridgeId], references: [id], onDelete: Cascade, onUpdate: Cascade)
units Int
date DateTime
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("shots")
}
4 changes: 2 additions & 2 deletions prisma/schema/schema.prisma
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema
generator client {
provider = "prisma-client-js"
provider = "prisma-client-js"
previewFeatures = ["prismaSchemaFolder"]
binaryTargets = ["native", "rhel-openssl-3.0.x"]
binaryTargets = ["native", "rhel-openssl-3.0.x"]
}

datasource db {
Expand Down
61 changes: 32 additions & 29 deletions prisma/schema/user.prisma
Original file line number Diff line number Diff line change
@@ -1,44 +1,47 @@
model User {
id BigInt @id @default(autoincrement())
email String @unique
name String?
avatar String? @db.VarChar(1600)
providers Provider[]
sessions Token[]
pens Pen[]
cartridges Cartridge[]
shots Shot[]
payload Json
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
id BigInt @id @default(autoincrement())
email String @unique
name String?
avatar String? @db.VarChar(1600)
providers Provider[]
sessions Token[]
pens Pen[]
cartridges Cartridge[]
shots Shot[]
payload Json
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("users")
}

model Provider {
id BigInt @id @default(autoincrement())
id BigInt @id @default(autoincrement())
userId BigInt
user User @relation(fields: [userId], references: [id])
name String?
avatar String? @db.VarChar(1600)
payload Json
user User @relation(fields: [userId], references: [id])
name String?
avatar String? @db.VarChar(1600)
payload Json
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("providers")
@@unique([userId, name])
@@map("providers")
}

model Token {
id BigInt @id @default(autoincrement())
userId BigInt
user User @relation(fields: [userId], references: [id])
hash String @unique
source String
ip String
agent String
location Json
id BigInt @id @default(autoincrement())
userId BigInt
user User @relation(fields: [userId], references: [id])
hash String @unique
source String
ip String
agent String
location Json
// coordinate Unsupported("Point")
coordinate String @default("30.2423 -97.7672")
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
coordinate String @default("30.2423 -97.7672")
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("tokens")
}
20 changes: 10 additions & 10 deletions server/api/[...slug].ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ import test from '../controllers/test'

const router = createRouter()

router.get('/me', authedHandler(async ({ user }) => metapi().render(user)))
router.get('/**', defineEventHandler(event => metapi().notFound(event)))
router.get('/me', authedHandler(async ({ user }) => metapi().render(user)))

if (useRuntimeConfig().appEnv === 'test')
router.post('/test/session', test.create)
Expand All @@ -25,14 +25,14 @@ router.get('/oauth/microsoft', microsoftHandler)

router.get('/logout', logout)

routing.apiResource('token', router, token)
routing.apiResource('pen', router, pen)
routing.apiResource('cartridge', router, cartridge)
routing.apiResource('shot', router, shot)
routing.apiResource('/token', router, token)
routing.apiResource('/pen', router, pen)
routing.apiResource('/cartridge', router, cartridge)
routing.apiResource('/shot', router, shot)

routing.apiResource('user', router, user)
routing.apiResource('user/:user/pen', router, pens)
routing.apiResource('user/:user/cartridge', router, cartridges)
routing.apiResource('user/:user/shot', router, shots)
routing.apiResource('/resource/user', router, user)
routing.apiResource('/user/:user/pen', router, pens)
routing.apiResource('/user/:user/cartridge', router, cartridges)
routing.apiResource('/user/:user/shot', router, shots)

export default useBase('/api/', router.handler)
export default useBase('/api', router.handler)
30 changes: 11 additions & 19 deletions server/controllers/cartridge.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { z } from 'zod'
import type { Cartridge } from '~/types/models'
import { cartridgeContents, cartridgeMgs, cartridgeMls } from '~/utils/shared'

const index = defineEventHandler(async (event) => {
const { user } = await requireUserSession(event)
const index = authedHandler(async ({ user, event }) => {
return metapi().render(
await prisma.cartridge.findMany({
where: {
Expand All @@ -16,8 +16,7 @@ const index = defineEventHandler(async (event) => {
)
})

const create = defineEventHandler(async (event) => {
const { user } = await requireUserSession(event)
const create = authedHandler(async ({ user, event }) => {
const schema = z.object({
content: z.enum(cartridgeContents as [string, ...string[]]),
ml: z.enum(cartridgeMls as [string, ...string[]]),
Expand All @@ -37,26 +36,19 @@ const create = defineEventHandler(async (event) => {
return metapi().success('cartridge created', cartridge)
})

const get = defineEventHandler(async (event) => {
const { user } = await requireUserSession(event)
const schema = z.object({ id: z.number() })
const parsed = schema.safeParse({ id: event.context.params?.id })
if (!parsed.success) return metapi().error(event, parsed.error.issues, 403)
const get = authedModelHandler<Cartridge>(async ({ event, user, model: cartridge }) => {
if (Number(cartridge.userId) !== Number(user.id))
return metapi().error(event, 'Unauthorized', 401)

return metapi().renderNullError(event, await prisma.cartridge.findUnique({
where: {
id: parsed.data.id,
userId: user.id,
},
}))
return metapi().render(cartridge)
})

const remove = defineEventHandler(async (event) => {
const { user } = await requireUserSession(event)
const id = event.context.params?.id
const remove = authedModelHandler<Cartridge>(async ({ event, user, model: cartridge }) => {
if (Number(cartridge.userId) !== Number(user.id))
return metapi().error(event, 'Unauthorized', 401)
await prisma.cartridge.delete({
where: {
id: Number.parseInt(id as string),
id: cartridge.id,
userId: user.id,
},
})
Expand Down
Loading

0 comments on commit ea4f27d

Please sign in to comment.