feat: 支持上课统计功能;优化会员管理默认筛选状态

This commit is contained in:
richarjiang
2026-09-09 10:04:29 +08:00
parent 30ebc1c344
commit 99c5c211ad
17 changed files with 594 additions and 20 deletions

View File

@@ -1,6 +1,7 @@
import { Test, TestingModule } from '@nestjs/testing'
import { BadRequestException, NotFoundException } from '@nestjs/common'
import { UserService } from '../user.service'
import { UserController } from '../user.controller'
import { PrismaService } from '../../prisma/prisma.service'
import {
MembershipStatus,
@@ -457,6 +458,24 @@ describe('UserService', () => {
expect(mockPrisma.lessonSupplement.groupBy).toHaveBeenCalledWith({ by: ['userId'], where: { userId: { in: ['user-1'] }, revokedAt: null }, _sum: { quantity: true } })
})
describe('member filters', () => {
it.each([
['ACTIVE', { memberships: { some: { status: MembershipStatus.ACTIVE } } }],
['NONE', { NOT: { memberships: { some: { status: MembershipStatus.ACTIVE } } } }],
['TIMES', { memberships: { some: { status: MembershipStatus.ACTIVE, cardType: { type: CardTypeCategory.TIMES } } } }],
['DURATION', { memberships: { some: { status: MembershipStatus.ACTIVE, cardType: { type: CardTypeCategory.DURATION } } } }],
['TRIAL', { memberships: { some: { status: MembershipStatus.ACTIVE, cardType: { type: CardTypeCategory.TRIAL } } } }],
[undefined, {}],
])('passes %s through the controller and applies the same filter to list and count', async (filter, where) => {
mockPrisma.user.findMany.mockResolvedValue([])
mockPrisma.user.count.mockResolvedValue(0)
const controller = new UserController(service)
await controller.getMembers('2', '20', undefined, filter as string | undefined)
expect(mockPrisma.user.findMany).toHaveBeenCalledWith(expect.objectContaining({ where, skip: 20, take: 20 }))
expect(mockPrisma.user.count).toHaveBeenCalledWith({ where })
})
})
describe('getMemberDetail', () => {
const cardType = {
id: 'ct-1',