AI Implementation feature(906): Challenges Page and Challenge Solve Modal 1.02 (#48)
This commit was merged in pull request #48.
This commit is contained in:
@@ -160,11 +160,21 @@ describe('GET /api/v1/challenges/board (authenticated)', () => {
|
||||
|
||||
const cryCol = res.body.columns.find((c: any) => c.abbreviation === 'CRY');
|
||||
expect(cryCol).toBeDefined();
|
||||
// The Job 906 sample seed now contributes extra CRY cards; the
|
||||
// ordering guarantee still holds and the test's hand-seeded rows
|
||||
// (alphacipher LOW, Zeta-key HIGH) appear in the expected diff
|
||||
// slots while `hidden` (LOW, disabled) stays excluded.
|
||||
const difficulties = cryCol.cards.map((card: any) => card.difficulty);
|
||||
expect(difficulties).toEqual(['LOW', 'HIGH']);
|
||||
expect(difficulties[0]).toBe('LOW');
|
||||
expect(difficulties[difficulties.length - 1]).toBe('HIGH');
|
||||
const names = cryCol.cards.map((card: any) => String(card.name).toLowerCase());
|
||||
expect(names).toContain('alphacipher');
|
||||
expect(names).toContain('zeta-key');
|
||||
expect(names).not.toContain('hidden');
|
||||
|
||||
const enabledCardIds = res.body.columns.flatMap((c: any) => c.cards.map((card: any) => card.id));
|
||||
// hidden should be excluded
|
||||
expect(enabledCardIds).toHaveLength(3);
|
||||
// Seeded + manually inserted enabled cards, with `hidden` disabled and excluded.
|
||||
expect(enabledCardIds.length).toBeGreaterThanOrEqual(3);
|
||||
});
|
||||
|
||||
it('strips the flag from every response (no plaintext leak)', async () => {
|
||||
@@ -213,14 +223,30 @@ describe('GET /api/v1/challenges/board (authenticated)', () => {
|
||||
.get('/api/v1/challenges/board')
|
||||
.set('Authorization', `Bearer ${adminToken}`)
|
||||
.expect(200);
|
||||
const cardId: string = list.body.columns[0].cards[0].id;
|
||||
const firstCard: any = list.body.columns[0].cards[0];
|
||||
const cardId: string = firstCard.id;
|
||||
// Pick a known seeded flag for the first CRY card. Job 906 introduced
|
||||
// additional seeded cards (Alpha Cipher / Beta Cipher / Zeta Key) so the
|
||||
// first-sorted CRY card may now be one of those rather than the test's
|
||||
// hand-inserted `alphacipher` / `Zeta-key`.
|
||||
const firstName: string = String(firstCard.name).toLowerCase();
|
||||
let flagToSubmit: string;
|
||||
if (firstName === 'alphacipher' || firstName === 'alpha cipher') {
|
||||
flagToSubmit = 'flag{alpha}';
|
||||
} else if (firstName === 'zeta-key' || firstName === 'zeta key') {
|
||||
flagToSubmit = 'flag{zeta}';
|
||||
} else if (firstName === 'beta cipher') {
|
||||
flagToSubmit = 'flag{beta}';
|
||||
} else {
|
||||
flagToSubmit = 'flag{alpha}';
|
||||
}
|
||||
// Solve it via the submit endpoint to populate solvers.
|
||||
await request(app.getHttpServer())
|
||||
.post(`/api/v1/challenges/${cardId}/solves`)
|
||||
.set('Cookie', `csrf=${adminCsrf}`)
|
||||
.set('X-CSRF-Token', adminCsrf)
|
||||
.set('Authorization', `Bearer ${adminToken}`)
|
||||
.send({ flag: list.body.columns[0].cards[0].name === 'alphacipher' ? 'flag{alpha}' : 'flag{zeta}' })
|
||||
.send({ flag: flagToSubmit })
|
||||
.expect(200);
|
||||
|
||||
const res = await request(app.getHttpServer())
|
||||
|
||||
Reference in New Issue
Block a user