Skip to content

Commit 708de24

Browse files
authored
Build:Setup prisma database/api tests step action && Feat: Tests userController listUser (#12)
1 parent cc9820a commit 708de24

19 files changed

Lines changed: 869 additions & 34 deletions

File tree

.env.example

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,33 @@
1-
#Setup Database
2-
DATABASE_URL="postgresql://user_db:password_db@localhost:5432/db_name?schema=public"
1+
#Setup Databases Containers for Prisma/App outside
2+
DATABASE_URL_APP="postgresql://POSTGRES_USER_DOCKER:POSTGRES_PASSWORD_DOCKER@localhost:5432/POSTGRES_DATABASE_DOCKER?schema=public"
3+
DATABASE_URL_TESTS="postgresql://POSTGRES_USER_DOCKER2:POSTGRES_PASSWORD_DOCKER2@localhost:5433/POSTGRES_DATABASE_DOCKER2?schema=public"
4+
5+
#Setup Databases Containers for Prisma Containers inside docker
6+
DATABASE_URL_DOCKER="postgresql://POSTGRES_USER_DOCKER:POSTGRES_PASSWORD_DOCKER@POSTGRES_HOST_DOCKER:5432/POSTGRES_DATABASE_DOCKER?schema=public"
7+
DATABASE_URL_DOCKER2="postgresql://POSTGRES_USER_DOCKER2:prisPOSTGRES_PASSWORD_DOCKER2ma2@POSTGRES_HOST_DOCKER:5432/POSTGRES_DATABASE_DOCKER2?schema=public"
38

49
POSTGRES_USER_DOCKER=
510
POSTGRES_PASSWORD_DOCKER=
611
POSTGRES_DATABASE_DOCKER=
712
POSTGRES_HOST_DOCKER=
8-
POSTGRES_PORT=5432
13+
14+
POSTGRES_USER_DOCKER2=
15+
POSTGRES_PASSWORD_DOCKER2=
16+
POSTGRES_DATABASE_DOCKER2=
17+
POSTGRES_HOST_DOCKER2=
918

1019
# Setup app
1120
HOST=localhost
12-
PORT=
21+
PORT=8080
1322

1423
SECRET=
1524
EXPIRES_IN=
1625

17-
DATABASE_URL_DOCKER="postgresql://POSTGRES_USER_DOCKER:POSTGRES_PASSWORD_DOCKER@POSTGRES_HOST_DOCKER:5432/POSTGRES_DATABASE_DOCKER?schema=public"
18-
1926
# Setup Tests
20-
BASE_URL=http://localhost:8080
27+
TESTS_PORT=8082
28+
29+
INVALID_TOKEN="eyJhbGciOiJIUzI1NiIsInR5cCI74687683jshjkahdjkgbssgafsag6IkpXVCJ9.eyJkYXRhcyI6eyJ1c2VyX2lkIjoiN2NhYzQ5ODUtZjA1NC00Yzc2LThkM2YtNWY4MWE3MjA4MTRjIiwidXNlcm5hbWUiOiJNYWNtaWxsZXIiLCJlbWFpbCI6Im1hY2FtYWOjM5LU2NTkzMTA4LCJleHAiOjE3NTY1OTM3MDgsImF1ZCI6InVzZXJzIiwiaXNzIjoiQURNSU4iLCJzdWIiOiI3Y2FjNDk4NS1mMDU0LTRjNzYtOGQzZi01ZjgxYTcyMDgxNGMifQ.4C2BNK73vJ0Tsns0v_cR-f5mnf2HEFbGi5JXG5sMIlo"
30+
31+
FAKE_TOKEN="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhcyI6eyJ1c2VyX2lkIjoiN2NhYzQ5ODUtZjA1NC00Yzc2LThkM2YtNWY4MWE3MjA4MTRjIiwidXNlcm5hbWUiOiJNYWNtaWxsZXIiLCJlbWFpbCI6Im1hY2FtYWdvbGZAZ21haWwuY29tIiwicGFzc3dvcmQiOiIkMmIkMDgkSkxGdmZsbnMuVktSbEFVc3o0VnZ0Lm5QdU85azZNazY1cktHS3YwcTh3MTl6T2w3UjVEelMiLCJjcmVhdGVkQXQiOiIyMDI1LTA4LTMwVDIyOjMxOjM5LjY4N1oifSwiaWF0IjoxNzU2NTkzMTA4LCJleHAiOjE3NTY1OTM3MDgsImF1ZCI6InVzZXJzIiwiaXNzIjoiQURNSU4iLCJzdWIiOiI3Y2FjNDk4NS1mMDU0LTRjNzYtOGQzZi01ZjgxYTcyMDgxNGMifQ.4C2BNK73vJ0Tsns0v_cR-f5mnf2HEFbGi5JXG5sMIle"
32+
33+
FAKE_USER_ID="89f84515-0e2c-44fd-a0aa-06107ea442bc"

.github/workflows/workflow.yml

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,19 @@ jobs:
3737
POSTGRES_PASSWORD_DOCKER: ${{ vars.POSTGRES_PASSWORD_DOCKER }}
3838
POSTGRES_DATABASE_DOCKER: ${{ vars.POSTGRES_DATABASE_DOCKER }}
3939
POSTGRES_HOST_DOCKER: ${{ vars.POSTGRES_HOST_DOCKER }}
40-
POSTGRES_PORT: ${{ vars.POSTGRES_PORT }}
40+
POSTGRES_USER_DOCKER2: ${{ vars.POSTGRES_USER_DOCKER2 }}
41+
POSTGRES_PASSWORD_DOCKER2: ${{ vars.POSTGRES_PASSWORD_DOCKER2 }}
42+
POSTGRES_DATABASE_DOCKER2: ${{ vars.POSTGRES_DATABASE_DOCKER2 }}
43+
POSTGRES_HOST_DOCKER2: ${{ vars.POSTGRES_HOST_DOCKER2 }}
4144
DATABASE_URL_DOCKER: ${{ vars.DATABASE_URL_DOCKER }}
42-
DATABASE_URL: ${{ vars.DATABASE_URL_LOCAL }}
45+
DATABASE_URL_DOCKER2: ${{ vars.DATABASE_URL_DOCKER2 }}
46+
DATABASE_URL_APP: ${{ vars.DATABASE_URL_APP }}
47+
DATABASE_URL_TESTS: ${{ vars.DATABASE_URL_TESTS }}
4348

4449
- name: Set up Prisma
45-
run: yarn setup:prisma
50+
run: yarn setup:prisma_tests
4651
env:
47-
DATABASE_URL: ${{ vars.DATABASE_URL_LOCAL }}
52+
DATABASE_URL_TESTS: ${{ vars.DATABASE_URL_TESTS }}
4853

4954
- name: "Run API and Tests"
5055
run: |
@@ -58,9 +63,12 @@ jobs:
5863
5964
yarn test:actions
6065
env:
61-
DATABASE_URL: ${{ vars.DATABASE_URL_LOCAL }}
66+
DATABASE_URL_TESTS: ${{ vars.DATABASE_URL_TESTS }}
6267
HOST: ${{ vars.HOST }}
6368
PORT: ${{ vars.PORT }}
69+
TESTS_PORT: ${{ vars.TESTS_PORT }}
6470
SECRET: ${{ secrets.SECRET }}
6571
EXPIRES_IN: ${{ vars.EXPIRES_IN }}
66-
BASE_URL: ${{ vars.BASE_URL }}
72+
FAKE_TOKEN: ${{ vars.FAKE_TOKEN }}
73+
INVALID_TOKEN: ${{ vars.INVALID_TOKEN }}
74+
FAKE_USER_ID: ${{ vars.FAKE_USER_ID }}

docker-compose.yml

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
services:
22

3-
postgres_db:
3+
postgres_db_app:
44
image: postgres
55
container_name: database_app
66
user: postgres
@@ -19,14 +19,45 @@ services:
1919
networks:
2020
- prisma-network
2121

22-
prisma:
22+
postgres_db_tests:
23+
image: postgres
24+
container_name: database_tests
25+
user: postgres
26+
restart: always
27+
ports:
28+
- "5433:5432"
29+
environment:
30+
- POSTGRES_USER=${POSTGRES_USER_DOCKER2}
31+
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD_DOCKER2}
32+
- POSTGRES_DB=${POSTGRES_DATABASE_DOCKER2}
33+
healthcheck:
34+
test: [ "CMD", "pg_isready" ]
35+
interval: 10s
36+
timeout: 5s
37+
retries: 5
38+
networks:
39+
- prisma-network
40+
41+
prisma_app:
42+
build: .
43+
container_name: prisma_app
44+
environment:
45+
- DATABASE_URL_APP=${DATABASE_URL_DOCKER}
46+
command: yarn setup:prisma_app
47+
depends_on:
48+
postgres_db_app:
49+
condition: service_healthy
50+
networks:
51+
- prisma-network
52+
53+
prisma_tests:
2354
build: .
24-
container_name: prisma
55+
container_name: prisma_tests
2556
environment:
26-
- DATABASE_URL=${DATABASE_URL_DOCKER}
27-
command: yarn setup:prisma
57+
- DATABASE_URL_TESTS=${DATABASE_URL_DOCKER2}
58+
command: yarn setup:prisma_tests
2859
depends_on:
29-
postgres_db:
60+
postgres_db_tests:
3061
condition: service_healthy
3162
networks:
3263
- prisma-network

package.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,15 @@
55
"main": "src/server.js",
66
"type": "module",
77
"scripts": {
8-
"dev": "node --watch --env-file=.env src/server.js",
8+
"dev": "npx prisma generate --schema prisma/schema2.prisma && node --watch --env-file=.env src/server.js",
99
"dev:actions": "node --watch src/server.js",
1010
"dev:debug": "node --inspect --env-file=.env src/server.js",
1111
"test": "node --test --experimental-test-coverage --env-file=.env",
1212
"test:actions": "node --test --experimental-test-coverage",
13-
"dc:up": "docker compose up -d && docker compose logs -f prisma",
13+
"dc:up": "docker compose up -d && docker compose logs -f prisma_app",
1414
"dc:down": "docker compose down --volumes --remove-orphans",
15-
"setup:prisma": "npx prisma migrate deploy && npx prisma generate && npx prisma db push"
15+
"setup:prisma_app": "npx prisma generate --schema prisma/schema.prisma && npx prisma migrate deploy --schema prisma/schema.prisma && npx prisma db push --schema prisma/schema.prisma",
16+
"setup:prisma_tests": "npx prisma generate --schema prisma/schema2.prisma && npx prisma migrate deploy --schema prisma/schema2.prisma && npx prisma db push --schema prisma/schema2.prisma"
1617
},
1718
"repository": {
1819
"type": "git",
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/*
2+
Warnings:
3+
4+
- You are about to drop the `Users` table. If the table is not empty, all the data it contains will be lost.
5+
6+
*/
7+
-- DropTable
8+
DROP TABLE "public"."Users";
9+
10+
-- CreateTable
11+
CREATE TABLE "public"."Users_Tests" (
12+
"user_id" TEXT NOT NULL,
13+
"username" TEXT NOT NULL,
14+
"email" TEXT NOT NULL,
15+
"password" TEXT NOT NULL,
16+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
17+
18+
CONSTRAINT "Users_Tests_pkey" PRIMARY KEY ("user_id")
19+
);
20+
21+
-- CreateTable
22+
CREATE TABLE "public"."UserTokens_Tests" (
23+
"id" TEXT NOT NULL,
24+
"user_id" TEXT NOT NULL,
25+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
26+
27+
CONSTRAINT "UserTokens_Tests_pkey" PRIMARY KEY ("id")
28+
);
29+
30+
-- CreateIndex
31+
CREATE UNIQUE INDEX "Users_Tests_email_key" ON "public"."Users_Tests"("email");
32+
33+
-- AddForeignKey
34+
ALTER TABLE "public"."UserTokens_Tests" ADD CONSTRAINT "UserTokens_Tests_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "public"."Users_Tests"("user_id") ON DELETE CASCADE ON UPDATE CASCADE;

prisma/schema.prisma

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ generator client {
44

55
datasource db {
66
provider = "postgresql"
7-
url = env("DATABASE_URL")
7+
url = env("DATABASE_URL_APP")
88
}
99

1010
model Users {

prisma/schema2.prisma

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
generator client2 {
2+
provider = "prisma-client-js"
3+
output = "../node_modules/@internal/prisma-second/client"
4+
}
5+
6+
datasource db2 {
7+
provider = "postgresql"
8+
url = env("DATABASE_URL_TESTS")
9+
}
10+
11+
model Users_Tests {
12+
user_id String @id
13+
username String
14+
email String @unique
15+
password String
16+
createdAt DateTime @default(now())
17+
UserToken UserTokens_Tests[]
18+
}
19+
20+
model UserTokens_Tests {
21+
id String @id @default(uuid())
22+
user_id String
23+
createdAt DateTime @default(now())
24+
user Users_Tests @relation(fields: [user_id], references: [user_id], onDelete: Cascade)
25+
}

src/server.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
1+
import { UserRoutesTests } from "./tests/in-memory-app/routes/user.routesTests.js";
12
import { UserRoutes } from "./routes/user.routes.js";
23
import { createServer } from "node:http";
34

45
const host = process.env.HOST;
56
const port = process.env.PORT;
7+
const testsPort = process.env.TESTS_PORT;
68

79
const userRoutes = new UserRoutes();
10+
const userRoutesTests = new UserRoutesTests();
811

912
export const server = createServer(userRoutes.handler);
13+
export const serverTests = createServer(userRoutesTests.handler);
1014

11-
server.listen(port, () => { console.log(`Server is running at http://${host}:${port} 🔥🚀`) });
15+
serverTests.listen(testsPort);
16+
server.listen(port, () => { console.log(`Server API is running at http://${host}:${port} 🔥🚀`) });
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import pkg from 'jsonwebtoken';
2+
const { verify } = pkg;
3+
4+
export class MiddlewareTests {
5+
6+
async ensureUserAuthenthicated(request, response) {
7+
8+
try {
9+
10+
const authToken = request.headers.authorization;
11+
const [, token] = authToken.split(' ');
12+
13+
verify(token, process.env.SECRET, {
14+
audience: "users",
15+
issuer: "ADMIN"
16+
});
17+
18+
return true;
19+
20+
}catch(error) {
21+
22+
if(error) {
23+
return error.message;
24+
}
25+
26+
}
27+
28+
}
29+
30+
}

0 commit comments

Comments
 (0)