fix(tooling): repair test, i18n and docs verification gates (#3331)

This commit is contained in:
Hampus authored and GitHub committed 2026-10-09 01:38:34 +02:00
1 parent ece622e800
commit f390e610b9
107 files changed
+5144 -3004

No files matched your search

@@ -25,6 +25,13 @@ interface AdminGuildUpdate {
};
}
interface AdminGuildMemberList {
members: Array<{user: {id: string}}>;
total: number;
limit: number;
offset: number;
}
describe('Admin guild routes', () => {
let harness: ApiTestHarness;
beforeEach(async () => {
@@ -123,19 +130,33 @@ describe('Admin guild routes', () => {
});
test('GET /admin/guilds/{guild_id}/members lists members', async () => {
const admin = await createTestAccount(harness);
await setUserACLs(harness, admin, ['admin:authenticate', 'guild:list:members']);
await setUserACLs(harness, admin, ['admin:authenticate', 'guild:list:members', 'guild:force_add_member']);
const guild = await createGuild(harness, admin.token, `Member List Guild ${Date.now()}`);
const result = await createBuilder<{
members: Array<unknown>;
total: number;
limit: number;
offset: number;
}>(harness, `${admin.token}`)
const joined = [await createTestAccount(harness), await createTestAccount(harness)];
for (const account of joined) {
await createBuilder(harness, `${admin.token}`)
.put(`/admin/guilds/${guild.id}/members/${account.userId}`)
.body(null)
.expect(HTTP_STATUS.OK)
.execute();
}
const expectedIds = [admin.userId, ...joined.map((account) => account.userId)].sort((a, b) =>
BigInt(a) < BigInt(b) ? -1 : BigInt(a) > BigInt(b) ? 1 : 0,
);
const result = await createBuilder<AdminGuildMemberList>(harness, `${admin.token}`)
.get(`/admin/guilds/${guild.id}/members?limit=10&offset=0`)
.expect(HTTP_STATUS.OK)
.execute();
expect(result.limit).toBe(10);
expect(result.offset).toBe(0);
expect(result.total).toBe(3);
expect(result.members.map((member) => member.user.id)).toEqual(expectedIds);
const page = await createBuilder<AdminGuildMemberList>(harness, `${admin.token}`)
.get(`/admin/guilds/${guild.id}/members?limit=1&offset=1`)
.expect(HTTP_STATUS.OK)
.execute();
expect(page.total).toBe(3);
expect(page.members.map((member) => member.user.id)).toEqual([expectedIds[1]]);
});
test('GET /admin/guilds/{guild_id}/members requires guild:list:members', async () => {
const admin = await createTestAccount(harness);
@@ -140,7 +140,7 @@ export const GuildAdminAuditCases: ReadonlyArray<AdminAuditCoverageCase> = [
action: 'list_guild_members',
targetType: 'guild',
targetId: guild.id,
metadata: {limit: '10', offset: '5', result_count: '0', total: '0'},
metadata: {limit: '10', offset: '5', result_count: '0', total: '1'},
},
};
},
@@ -23,6 +23,10 @@ import {ValidationErrorCodes} from '@fluxer/constants/src/ValidationErrorCodes';
import type {GuildBanResponse, GuildMemberResponse} from '@fluxer/schema/src/domains/guild/GuildMemberSchemas';
import {afterEach, beforeEach, describe, expect, test} from 'vitest';
function sortSnowflakes(ids: Array<string>): Array<string> {
return [...ids].sort((a, b) => (BigInt(a) < BigInt(b) ? -1 : BigInt(a) > BigInt(b) ? 1 : 0));
}
describe('Guild Member Management', () => {
let harness: ApiTestHarness;
beforeEach(async () => {
@@ -377,23 +381,27 @@ describe('Guild Member Management', () => {
.execute();
});
test('should allow regular member to list guild members', async () => {
const {members, guild} = await setupTestGuildWithMembers(harness, 1);
const {owner, members, guild} = await setupTestGuildWithMembers(harness, 1);
const member = members[0];
await createBuilder(harness, member.token).get(`/guilds/${guild.id}/members`).expect(HTTP_STATUS.OK).execute();
const memberList = await createBuilder<Array<GuildMemberResponse>>(harness, member.token)
.get(`/guilds/${guild.id}/members?limit=10`)
.expect(HTTP_STATUS.OK)
.execute();
expect(memberList.map((entry) => entry.user.id)).toEqual(sortSnowflakes([owner.userId, member.userId]));
});
test('should support limit parameter for listing members', async () => {
const {owner, guild} = await setupTestGuildWithMembers(harness, 3);
const memberList = await createBuilder<
Array<{
user: {
id: string;
};
}>
>(harness, owner.token)
const {owner, members, guild} = await setupTestGuildWithMembers(harness, 3);
const expectedIds = sortSnowflakes([owner.userId, ...members.map((member) => member.userId)]);
const firstPage = await createBuilder<Array<GuildMemberResponse>>(harness, owner.token)
.get(`/guilds/${guild.id}/members?limit=2`)
.expect(HTTP_STATUS.OK)
.execute();
expect(memberList.length).toBeLessThanOrEqual(2);
expect(firstPage.map((entry) => entry.user.id)).toEqual(expectedIds.slice(0, 2));
const secondPage = await createBuilder<Array<GuildMemberResponse>>(harness, owner.token)
.get(`/guilds/${guild.id}/members?limit=2&after=${firstPage[1]!.user.id}`)
.expect(HTTP_STATUS.OK)
.execute();
expect(secondPage.map((entry) => entry.user.id)).toEqual(expectedIds.slice(2));
});
});
describe('Get Member Permission Checks', () => {
+24 -4
View File
@@ -656,18 +656,38 @@ export class NoopGatewayService extends IGatewayService {
return members?.has(params.userId) ?? false;
}
async listGuildMembers(_params: {guildId: GuildID; limit: number; offset: number}): Promise<{
async listGuildMembers(params: {guildId: GuildID; limit: number; offset: number}): Promise<{
members: Array<GuildMemberResponse>;
total: number;
}> {
return {members: [], total: 0};
const userIds = await this.sortedMemberIds(params.guildId);
const page = params.limit > 0 ? userIds.slice(params.offset, params.offset + params.limit) : [];
return {members: await this.memberResponses(params.guildId, page), total: userIds.length};
}
async listGuildMembersCursor(_params: {guildId: GuildID; limit: number; after?: UserID}): Promise<{
async listGuildMembersCursor(params: {guildId: GuildID; limit: number; after?: UserID}): Promise<{
members: Array<GuildMemberResponse>;
total: number;
}> {
return {members: [], total: 0};
const userIds = await this.sortedMemberIds(params.guildId);
const after = params.after;
const remaining = after === undefined ? userIds : userIds.filter((userId) => userId > after);
const page = params.limit > 0 ? remaining.slice(0, params.limit) : [];
return {members: await this.memberResponses(params.guildId, page), total: userIds.length};
}
private async sortedMemberIds(guildId: GuildID): Promise<Array<UserID>> {
const members = await guildMemberRepository.listMembers(guildId);
return members.map((member) => member.userId).sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));
}
private async memberResponses(guildId: GuildID, userIds: Array<UserID>): Promise<Array<GuildMemberResponse>> {
const members: Array<GuildMemberResponse> = [];
for (const userId of userIds) {
const {memberData} = await this.getGuildMember({guildId, userId});
if (memberData) members.push(memberData);
}
return members;
}
async checkPermission(params: {
+1
View File
@@ -57,6 +57,7 @@ const sharedTestConfig = {
testTimeout: 40000,
hookTimeout: 20000,
maxConcurrency: configuredMaxConcurrency,
execArgv: ['--no-experimental-webstorage', '--disable-warning=ExperimentalWarning'],
};
export default defineConfig({