93 lines
3.1 KiB
TypeScript
93 lines
3.1 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
|
|
|
import { resolveLocalAccountProfilePolicy } from '../src/auth/localAccountPolicy.js';
|
|
import type { UserRecord } from '../src/auth/userRepository.js';
|
|
|
|
const buildLocalUser = (graceStartedAt: Date): UserRecord => ({
|
|
id: 'local-user',
|
|
username: 'local-user',
|
|
displayName: '로컬유저',
|
|
roles: ['user'],
|
|
sanctions: {},
|
|
oauthType: 'NONE',
|
|
picture: 'default.jpg',
|
|
imageServer: 0,
|
|
thirdPartyUse: false,
|
|
kakaoGraceStartedAt: graceStartedAt.toISOString(),
|
|
passwordHash: 'unused',
|
|
passwordSalt: '',
|
|
createdAt: graceStartedAt.toISOString(),
|
|
});
|
|
|
|
describe('local account profile policy', () => {
|
|
it.each(['che', 'kwe', 'twe'])('%s blocks general creation before Kakao verification', (profile) => {
|
|
const now = new Date('2026-07-26T00:00:00.000Z');
|
|
const policy = resolveLocalAccountProfilePolicy({
|
|
profile,
|
|
defaultGraceDays: 7,
|
|
user: buildLocalUser(now),
|
|
now,
|
|
});
|
|
|
|
expect(policy.accessAllowed).toBe(true);
|
|
expect(policy.canCreateGeneral).toBe(false);
|
|
expect(policy.generalCreationGraceDays).toBe(0);
|
|
});
|
|
|
|
it.each(['nya', 'pya', 'hwe'])('%s allows general creation during the configured grace period', (profile) => {
|
|
const start = new Date('2026-07-20T00:00:00.000Z');
|
|
const policy = resolveLocalAccountProfilePolicy({
|
|
profile,
|
|
defaultGraceDays: 7,
|
|
user: buildLocalUser(start),
|
|
now: new Date('2026-07-26T00:00:00.000Z'),
|
|
});
|
|
|
|
expect(policy.accessAllowed).toBe(true);
|
|
expect(policy.canCreateGeneral).toBe(true);
|
|
expect(policy.generalCreationGraceDays).toBe(7);
|
|
});
|
|
|
|
it('honors profile metadata overrides and blocks all access after expiry', () => {
|
|
const policy = resolveLocalAccountProfilePolicy({
|
|
profile: 'hwe',
|
|
profileMeta: {
|
|
localAccountAccessGraceDays: 3,
|
|
localAccountGeneralCreationGraceDays: 1,
|
|
},
|
|
defaultGraceDays: 7,
|
|
user: buildLocalUser(new Date('2026-07-20T00:00:00.000Z')),
|
|
now: new Date('2026-07-26T00:00:00.000Z'),
|
|
});
|
|
|
|
expect(policy).toMatchObject({
|
|
accessAllowed: false,
|
|
canCreateGeneral: false,
|
|
accessGraceDays: 3,
|
|
generalCreationGraceDays: 1,
|
|
});
|
|
});
|
|
|
|
it('removes grace restrictions once Kakao is verified', () => {
|
|
const user = buildLocalUser(new Date('2020-01-01T00:00:00.000Z'));
|
|
user.oauthType = 'KAKAO';
|
|
user.oauthId = '1';
|
|
user.email = 'verified@example.test';
|
|
user.kakaoVerifiedAt = '2026-07-26T00:00:00.000Z';
|
|
const policy = resolveLocalAccountProfilePolicy({
|
|
profile: 'che',
|
|
defaultGraceDays: 0,
|
|
user,
|
|
now: new Date('2026-07-26T00:00:00.000Z'),
|
|
});
|
|
|
|
expect(policy).toMatchObject({
|
|
kakaoVerified: true,
|
|
requiresKakaoVerification: false,
|
|
accessAllowed: true,
|
|
canCreateGeneral: true,
|
|
graceEndsAt: null,
|
|
});
|
|
});
|
|
});
|