chore: test code for cases index (#279)

This commit is contained in:
kimatata
2025-09-13 12:11:22 +09:00
committed by GitHub
parent a7882dd769
commit 72fd3af24f
4 changed files with 148 additions and 41 deletions

View File

@@ -1,12 +1,14 @@
const express = require('express');
import express from 'express';
const router = express.Router();
const { DataTypes, Op } = require('sequelize');
const defineCase = require('../../models/cases');
import { DataTypes, Op } from 'sequelize';
import defineCase from '../../models/cases';
import authMiddleware from '../../middleware/auth.js';
import visibilityMiddleware from '../../middleware/verifyVisible';
module.exports = function (sequelize) {
export default function (sequelize) {
const { verifySignedIn } = authMiddleware(sequelize);
const Case = defineCase(sequelize, DataTypes);
const { verifySignedIn } = require('../../middleware/auth')(sequelize);
const { verifyProjectVisibleFromFolderId } = require('../../middleware/verifyVisible')(sequelize);
const { verifyProjectVisibleFromFolderId } = visibilityMiddleware(sequelize);
router.get('/', verifySignedIn, verifyProjectVisibleFromFolderId, async (req, res) => {
const { folderId, priority, type, q } = req.query;
@@ -63,4 +65,4 @@ module.exports = function (sequelize) {
});
return router;
};
}

View File

@@ -0,0 +1,74 @@
import { describe, it, expect, vi, beforeEach } from 'vitest';
import request from 'supertest';
import express from 'express';
import { Sequelize, Op } from 'sequelize';
import casesIndexRoute from './index';
// mock of authentication middleware
vi.mock('../../middleware/auth', () => ({
default: () => ({
verifySignedIn: vi.fn((req, res, next) => {
req.userId = 1;
next();
}),
}),
}));
vi.mock('../../middleware/verifyVisible', () => ({
default: () => ({
verifyProjectVisibleFromFolderId: vi.fn((req, res, next) => {
next();
}),
}),
}));
// mock defineCase
const mockCase = {
findAll: vi.fn(),
};
vi.mock('../../models/cases', () => ({
default: () => mockCase,
}));
describe('GET /cases', () => {
let app;
const sequelize = new Sequelize({
dialect: 'sqlite',
logging: false,
});
beforeEach(() => {
app = express();
app.use(express.json());
// Mount the index route
app.use('/cases', casesIndexRoute(sequelize));
});
it('should return 400 if folderId is missing', async () => {
const res = await request(app).get('/cases');
expect(res.status).toBe(400);
expect(res.body.error).toBe('folderId is required');
});
it('should call findAll with correct where clause for folderId only', async () => {
mockCase.findAll.mockResolvedValue([{ id: 1 }]);
const res = await request(app).get('/cases?folderId=1');
expect(res.status).toBe(200);
expect(mockCase.findAll).toHaveBeenCalledWith({ where: { folderId: '1' } });
expect(res.body).toEqual([{ id: 1 }]);
});
it('should build a where clause based on query parameters.', async () => {
mockCase.findAll.mockResolvedValue([{ id: 1 }]);
const res = await request(app).get('/cases?folderId=1&priority=1,2&type=3');
expect(res.status).toBe(200);
expect(mockCase.findAll).toHaveBeenCalledWith({
where: {
folderId: '1',
priority: { [Op.in]: [1, 2] },
type: { [Op.in]: [3] },
},
});
});
});