From abca9af3bb45fb15f09bc1250ab0c7a3d7b36da9 Mon Sep 17 00:00:00 2001 From: takonasu Date: Sun, 19 Mar 2023 13:30:06 +0900 Subject: [PATCH] =?UTF-8?q?add:=20=E3=82=BB=E3=83=83=E3=82=B7=E3=83=A7?= =?UTF-8?q?=E3=83=B3=E6=B6=88=E5=8E=BB=E6=A9=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __tests__/grpc/Session.service.test.ts | 98 +++++++++++++++++--------- jest.config.ts | 2 +- protos/SessionService.proto | 9 ++- src/database/prisma-client.ts | 2 +- src/database/session.ts | 12 ++++ src/grpc/session.service.ts | 33 ++++++++- 6 files changed, 118 insertions(+), 38 deletions(-) diff --git a/__tests__/grpc/Session.service.test.ts b/__tests__/grpc/Session.service.test.ts index 3b161f5..256689c 100644 --- a/__tests__/grpc/Session.service.test.ts +++ b/__tests__/grpc/Session.service.test.ts @@ -1,4 +1,5 @@ import { startGrpcServer, stopGrpcServer } from '../../src/grpc' +import { prismaClient } from '../../src/database/prisma-client' import * as protoLoader from '@grpc/proto-loader' import path from 'path' import * as grpc from '@grpc/grpc-js' @@ -22,26 +23,32 @@ beforeAll(async () => { ) as unknown) as GrpcClient }) -const userId = uuid() -let sessionId = '' - -test('セッションを作成する', (done) => { - client.startSession({ userId }, (err, res) => { +const userId = [uuid(), uuid()] +let sessionId = ['', ''] +test('セッションAを作成する', (done) => { + client.startSession({ userId: userId[0] }, (err, res) => { + expect(err).toBeNull() + expect(res?.session?.userId).toEqual(userId[0]) + expect(res?.session?.sessionId).not.toBeNull() + sessionId[0] = res?.session?.sessionId ?? '' + done() + }) +}) +test('セッションBを作成する', (done) => { + client.startSession({ userId: userId[1] }, (err, res) => { expect(err).toBeNull() - expect(res?.session?.userId).toEqual(userId) + expect(res?.session?.userId).toEqual(userId[1]) expect(res?.session?.sessionId).not.toBeNull() - sessionId = res?.session?.sessionId ?? '' - console.log(res) + sessionId[1] = res?.session?.sessionId ?? '' done() }) }) -test('存在するセッションを返す', (done) => { - client.getSession({ sessionId }, (err, res) => { - console.log(err) +test('存在するセッションAを返す', (done) => { + client.getSession({ sessionId: sessionId[0] }, (err, res) => { expect(err).toBeNull() - expect(res?.userId).toEqual(userId) - expect(res?.sessionId).toEqual(sessionId) + expect(res?.userId).toEqual(userId[0]) + expect(res?.sessionId).toEqual(sessionId[0]) done() }) }) @@ -53,26 +60,51 @@ test('存在しないセッションでエラーを返す', (done) => { }) }) -//未実装 -// test('セッションを消去する', (done) => { -// client.deleteSession({ sessionId }, (err, res) => { -// expect(err).toBeNull() -// done() -// }) -// }) +test('存在しないセッション(空文字列)でエラーを返す', (done) => { + client.getSession({ sessionId: '' }, (err, res) => { + expect(err?.code).toBe(3) + done() + }) +}) + +test('セッションAを消去する', (done) => { + client.deleteSession({ sessionId: sessionId[0] }, (err, res) => { + expect(err).toBeNull() + done() + }) +}) + +test('存在しないセッションを消去するとエラーを返す', (done) => { + client.deleteSession({ sessionId: uuid() }, (err, res) => { + expect(err?.code).toBe(5) + done() + }) +}) + +test('存在しないセッション(空文字列)を消去するとエラーを返す', (done) => { + client.deleteSession({ sessionId: '' }, (err, res) => { + expect(err?.code).toBe(3) + done() + }) +}) -// test('存在しないセッションを消去するとエラーを返す', (done) => { -// client.deleteSession({ sessionId: uuid() }, (err, res) => { -// expect(err?.code).toBe(5) -// done() -// }) -// }) +test('消去したセッションAを得ようとしてもエラーを返す', (done) => { + client.getSession({ sessionId: sessionId[0] }, (err, res) => { + expect(err?.code).toBe(5) + done() + }) +}) -// test('消去したセッションを得ようとしてもエラーを返す', (done) => { -// client.getSession({ sessionId }, (err, res) => { -// expect(err?.code).toBe(5) -// done() -// }) -// }) +test('存在するセッションBを返す', (done) => { + client.getSession({ sessionId: sessionId[1] }, (err, res) => { + expect(err).toBeNull() + expect(res?.userId).toEqual(userId[1]) + expect(res?.sessionId).toEqual(sessionId[1]) + done() + }) +}) -afterAll(stopGrpcServer) +afterAll(() => { + stopGrpcServer() + prismaClient.$disconnect() +}) diff --git a/jest.config.ts b/jest.config.ts index 7584c17..0d0df4d 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -125,7 +125,7 @@ export default { // runner: "jest-runner", // The paths to modules that run some code to configure or set up the testing environment before each test - // setupFiles: [], + setupFiles: ['dotenv/config'], // A list of paths to modules that run some code to configure or set up the testing framework before each test // setupFilesAfterEnv: [], diff --git a/protos/SessionService.proto b/protos/SessionService.proto index dc33fdf..cf81578 100644 --- a/protos/SessionService.proto +++ b/protos/SessionService.proto @@ -5,6 +5,7 @@ import "google/protobuf/timestamp.proto"; service SessionService { rpc StartSession(StartSessionRequest) returns (StartSessionResponse); rpc GetSession(GetSessionRequest) returns (Session); + rpc DeleteSession(DeleteSessionRequest) returns (DeleteSessionResponse); } message StartSessionRequest { @@ -29,4 +30,10 @@ message Session { string session_id = 1; string user_id = 2; google.protobuf.Timestamp expired_at = 3; -} \ No newline at end of file +} + +message DeleteSessionRequest { + string session_id = 1; +} + +message DeleteSessionResponse {} \ No newline at end of file diff --git a/src/database/prisma-client.ts b/src/database/prisma-client.ts index 57cc17d..1f815c3 100644 --- a/src/database/prisma-client.ts +++ b/src/database/prisma-client.ts @@ -1,3 +1,3 @@ import { PrismaClient } from '@prisma/client' -export const prismaClient = new PrismaClient({ log: ['query'] }) +export const prismaClient = new PrismaClient({ log: ['error'] }) diff --git a/src/database/session.ts b/src/database/session.ts index 231b141..d7756ba 100644 --- a/src/database/session.ts +++ b/src/database/session.ts @@ -29,3 +29,15 @@ export async function findActiveSessionById({ }, }) } + +export async function deleteSessionById({ + id, +}: { + id: string +}): Promise<{ id: string } | null> { + return await prismaClient.session.delete({ + where: { + id, + }, + }) +} diff --git a/src/grpc/session.service.ts b/src/grpc/session.service.ts index d440935..60110dc 100644 --- a/src/grpc/session.service.ts +++ b/src/grpc/session.service.ts @@ -1,13 +1,24 @@ import { Status } from '@grpc/grpc-js/build/src/constants' import dayjs from 'dayjs' -import { google, SessionService, StartSessionResponse } from '../../generated' +import { + SessionService, + StartSessionResponse, + DeleteSessionResponse, +} from '../../generated' import { sessionLifeTimeHours } from '../constant' -import { createSession, findActiveSessionById } from '../database/session' +import { + createSession, + findActiveSessionById, + deleteSessionById, +} from '../database/session' import { GrpcServer } from './type' import { transformSession } from './transformer' export const sessionService: GrpcServer = { async startSession({ request }, callback) { + if (!request.userId) { + return callback({ code: Status.INVALID_ARGUMENT }) + } const session = await createSession({ userId: request.userId, expiredAt: dayjs().add(sessionLifeTimeHours, 'hour'), @@ -25,6 +36,9 @@ export const sessionService: GrpcServer = { ) }, async getSession({ request }, callback) { + if (!request.sessionId) { + return callback({ code: Status.INVALID_ARGUMENT }) + } const session = await findActiveSessionById({ id: request.sessionId, }) @@ -35,4 +49,19 @@ export const sessionService: GrpcServer = { callback(null, transformSession(session)) }, + async deleteSession({ request }, callback) { + if (!request.sessionId) { + return callback({ code: Status.INVALID_ARGUMENT }) + } + + try { + await deleteSessionById({ + id: request.sessionId, + }) + } catch { + return callback({ code: Status.NOT_FOUND }) + } + + callback(null, DeleteSessionResponse.create()) + }, }