mirror of
https://github.com/fluxerapp/fluxer
synced 2026-10-17 21:15:32 +09:00
fix(tooling): repair test, i18n and docs verification gates (#3331)
This commit is contained in:
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', () => {
|
||||
|
||||
@@ -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: {
|
||||
|
||||
@@ -57,6 +57,7 @@ const sharedTestConfig = {
|
||||
testTimeout: 40000,
|
||||
hookTimeout: 20000,
|
||||
maxConcurrency: configuredMaxConcurrency,
|
||||
execArgv: ['--no-experimental-webstorage', '--disable-warning=ExperimentalWarning'],
|
||||
};
|
||||
|
||||
export default defineConfig({
|
||||
|
||||
Reference in new issue
Block a user