use oxfmt instead of prettier

This commit is contained in:
pa
2026-03-13 22:30:12 +09:00
parent 82122a4fab
commit 7b7c1b4568
155 changed files with 3467 additions and 1631 deletions

View File

@@ -10,7 +10,7 @@ vi.mock('vue-i18n', () => ({
locale: require('vue').ref('en')
}),
createI18n: () => ({
global: { t: (key) => key , locale: require('vue').ref('en') },
global: { t: (key) => key, locale: require('vue').ref('en') },
install: vi.fn()
})
}));

View File

@@ -3,12 +3,11 @@ import { mount } from '@vue/test-utils';
vi.mock('vue-i18n', () => ({
useI18n: () => ({
t: (key) => key
,
locale: require('vue').ref('en')
}),
t: (key) => key,
locale: require('vue').ref('en')
}),
createI18n: () => ({
global: { t: (key) => key , locale: require('vue').ref('en') },
global: { t: (key) => key, locale: require('vue').ref('en') },
install: vi.fn()
})
}));
@@ -53,7 +52,8 @@ function mountComponent(props = {}) {
Trash2: { template: '<svg class="trash-icon" />' },
X: { template: '<svg class="x-icon" />' },
TooltipWrapper: {
template: '<div class="tooltip-stub"><slot /><slot name="content" /></div>'
template:
'<div class="tooltip-stub"><slot /><slot name="content" /></div>'
}
}
}
@@ -68,24 +68,32 @@ describe('GroupModerationBulkActions.vue', () => {
describe('rendering', () => {
test('renders user ID input field', () => {
const wrapper = mountComponent();
expect(wrapper.text()).toContain('dialog.group_member_moderation.user_id');
expect(wrapper.text()).toContain(
'dialog.group_member_moderation.user_id'
);
});
test('renders selected users section', () => {
const wrapper = mountComponent();
expect(wrapper.text()).toContain('dialog.group_member_moderation.selected_users');
expect(wrapper.text()).toContain(
'dialog.group_member_moderation.selected_users'
);
});
test('renders roles dropdown with available roles', () => {
const wrapper = mountComponent();
expect(wrapper.text()).toContain('dialog.group_member_moderation.selected_roles');
expect(wrapper.text()).toContain(
'dialog.group_member_moderation.selected_roles'
);
});
test('renders action buttons', () => {
const wrapper = mountComponent();
const text = wrapper.text();
expect(text).toContain('dialog.group_member_moderation.add_roles');
expect(text).toContain('dialog.group_member_moderation.remove_roles');
expect(text).toContain(
'dialog.group_member_moderation.remove_roles'
);
expect(text).toContain('dialog.group_member_moderation.save_note');
expect(text).toContain('dialog.group_member_moderation.kick');
expect(text).toContain('dialog.group_member_moderation.ban');
@@ -95,8 +103,18 @@ describe('GroupModerationBulkActions.vue', () => {
test('renders selected user badges', () => {
const wrapper = mountComponent({
selectedUsersArray: [
{ id: 'usr_1', userId: 'usr_1', membershipStatus: 'member', user: { displayName: 'Alice' } },
{ id: 'usr_2', userId: 'usr_2', membershipStatus: 'member', user: { displayName: 'Bob' } }
{
id: 'usr_1',
userId: 'usr_1',
membershipStatus: 'member',
user: { displayName: 'Alice' }
},
{
id: 'usr_2',
userId: 'usr_2',
membershipStatus: 'member',
user: { displayName: 'Bob' }
}
]
});
expect(wrapper.text()).toContain('Alice');
@@ -106,54 +124,88 @@ describe('GroupModerationBulkActions.vue', () => {
test('shows warning tooltip for non-member users', () => {
const wrapper = mountComponent({
selectedUsersArray: [
{ id: 'usr_1', userId: 'usr_1', membershipStatus: 'banned', user: { displayName: 'Charlie' } }
{
id: 'usr_1',
userId: 'usr_1',
membershipStatus: 'banned',
user: { displayName: 'Charlie' }
}
]
});
expect(wrapper.text()).toContain('dialog.group_member_moderation.user_isnt_in_group');
expect(wrapper.text()).toContain(
'dialog.group_member_moderation.user_isnt_in_group'
);
});
test('does not show warning for member users', () => {
const wrapper = mountComponent({
selectedUsersArray: [
{ id: 'usr_1', userId: 'usr_1', membershipStatus: 'member', user: { displayName: 'Alice' } }
{
id: 'usr_1',
userId: 'usr_1',
membershipStatus: 'member',
user: { displayName: 'Alice' }
}
]
});
expect(wrapper.text()).not.toContain('dialog.group_member_moderation.user_isnt_in_group');
expect(wrapper.text()).not.toContain(
'dialog.group_member_moderation.user_isnt_in_group'
);
});
});
describe('progress indicator', () => {
test('shows progress when progressCurrent > 0', () => {
const wrapper = mountComponent({ progressCurrent: 3, progressTotal: 10 });
expect(wrapper.text()).toContain('dialog.group_member_moderation.progress');
const wrapper = mountComponent({
progressCurrent: 3,
progressTotal: 10
});
expect(wrapper.text()).toContain(
'dialog.group_member_moderation.progress'
);
expect(wrapper.text()).toContain('3/10');
});
test('shows cancel button during progress', () => {
const wrapper = mountComponent({ progressCurrent: 3, progressTotal: 10 });
expect(wrapper.text()).toContain('dialog.group_member_moderation.cancel');
const wrapper = mountComponent({
progressCurrent: 3,
progressTotal: 10
});
expect(wrapper.text()).toContain(
'dialog.group_member_moderation.cancel'
);
});
test('hides progress when not in progress', () => {
const wrapper = mountComponent({ progressCurrent: 0 });
expect(wrapper.text()).not.toContain('dialog.group_member_moderation.progress');
expect(wrapper.text()).not.toContain(
'dialog.group_member_moderation.progress'
);
});
});
describe('button disabled states', () => {
test('add/remove roles disabled when no roles selected', () => {
const wrapper = mountComponent({ selectedRoles: [] });
const addBtn = wrapper.findAll('button').find((b) =>
b.text().includes('dialog.group_member_moderation.add_roles')
);
const addBtn = wrapper
.findAll('button')
.find((b) =>
b
.text()
.includes('dialog.group_member_moderation.add_roles')
);
expect(addBtn.attributes('disabled')).toBeDefined();
});
test('add/remove roles enabled when roles are selected', () => {
const wrapper = mountComponent({ selectedRoles: ['role_1'] });
const addBtn = wrapper.findAll('button').find((b) =>
b.text().includes('dialog.group_member_moderation.add_roles')
);
const addBtn = wrapper
.findAll('button')
.find((b) =>
b
.text()
.includes('dialog.group_member_moderation.add_roles')
);
expect(addBtn.attributes('disabled')).toBeUndefined();
});
@@ -163,25 +215,35 @@ describe('GroupModerationBulkActions.vue', () => {
progressCurrent: 5,
progressTotal: 10
});
const kickBtn = wrapper.findAll('button').find((b) =>
b.text().includes('dialog.group_member_moderation.kick')
);
const kickBtn = wrapper
.findAll('button')
.find((b) =>
b.text().includes('dialog.group_member_moderation.kick')
);
expect(kickBtn.attributes('disabled')).toBeDefined();
});
test('select user button disabled when no user ID entered', () => {
const wrapper = mountComponent({ selectUserId: '' });
const selectBtn = wrapper.findAll('button').find((b) =>
b.text().includes('dialog.group_member_moderation.select_user')
);
const selectBtn = wrapper
.findAll('button')
.find((b) =>
b
.text()
.includes('dialog.group_member_moderation.select_user')
);
expect(selectBtn.attributes('disabled')).toBeDefined();
});
test('select user button enabled when user ID is entered', () => {
const wrapper = mountComponent({ selectUserId: 'usr_test' });
const selectBtn = wrapper.findAll('button').find((b) =>
b.text().includes('dialog.group_member_moderation.select_user')
);
const selectBtn = wrapper
.findAll('button')
.find((b) =>
b
.text()
.includes('dialog.group_member_moderation.select_user')
);
expect(selectBtn.attributes('disabled')).toBeUndefined();
});
});
@@ -194,9 +256,11 @@ describe('GroupModerationBulkActions.vue', () => {
_mockPermissions: ['group-bans-manage']
}
});
const kickBtn = wrapper.findAll('button').find((b) =>
b.text().includes('dialog.group_member_moderation.kick')
);
const kickBtn = wrapper
.findAll('button')
.find((b) =>
b.text().includes('dialog.group_member_moderation.kick')
);
expect(kickBtn.attributes('disabled')).toBeDefined();
});
@@ -207,12 +271,16 @@ describe('GroupModerationBulkActions.vue', () => {
_mockPermissions: ['group-members-remove']
}
});
const banBtn = wrapper.findAll('button').find((b) =>
b.text().includes('dialog.group_member_moderation.ban')
);
const unbanBtn = wrapper.findAll('button').find((b) =>
b.text().includes('dialog.group_member_moderation.unban')
);
const banBtn = wrapper
.findAll('button')
.find((b) =>
b.text().includes('dialog.group_member_moderation.ban')
);
const unbanBtn = wrapper
.findAll('button')
.find((b) =>
b.text().includes('dialog.group_member_moderation.unban')
);
expect(banBtn.attributes('disabled')).toBeDefined();
expect(unbanBtn.attributes('disabled')).toBeDefined();
});
@@ -221,9 +289,13 @@ describe('GroupModerationBulkActions.vue', () => {
describe('events', () => {
test('emits select-user on select button click', async () => {
const wrapper = mountComponent({ selectUserId: 'usr_test' });
const selectBtn = wrapper.findAll('button').find((b) =>
b.text().includes('dialog.group_member_moderation.select_user')
);
const selectBtn = wrapper
.findAll('button')
.find((b) =>
b
.text()
.includes('dialog.group_member_moderation.select_user')
);
await selectBtn.trigger('click');
expect(wrapper.emitted('select-user')).toBeTruthy();
});
@@ -241,7 +313,12 @@ describe('GroupModerationBulkActions.vue', () => {
});
test('emits delete-user when removing a selected user', async () => {
const user = { id: 'usr_1', userId: 'usr_1', membershipStatus: 'member', user: { displayName: 'Alice' } };
const user = {
id: 'usr_1',
userId: 'usr_1',
membershipStatus: 'member',
user: { displayName: 'Alice' }
};
const wrapper = mountComponent({ selectedUsersArray: [user] });
// The X button is a native <button type="button"> inside each Badge
const deleteBtn = wrapper.find('button[type="button"]');
@@ -251,18 +328,25 @@ describe('GroupModerationBulkActions.vue', () => {
test('emits ban on ban button click', async () => {
const wrapper = mountComponent();
const banBtn = wrapper.findAll('button').find((b) =>
b.text().includes('dialog.group_member_moderation.ban')
);
const banBtn = wrapper
.findAll('button')
.find((b) =>
b.text().includes('dialog.group_member_moderation.ban')
);
await banBtn.trigger('click');
expect(wrapper.emitted('ban')).toBeTruthy();
});
test('emits cancel-progress on cancel click', async () => {
const wrapper = mountComponent({ progressCurrent: 3, progressTotal: 10 });
const cancelBtn = wrapper.findAll('button').find((b) =>
b.text().includes('dialog.group_member_moderation.cancel')
);
const wrapper = mountComponent({
progressCurrent: 3,
progressTotal: 10
});
const cancelBtn = wrapper
.findAll('button')
.find((b) =>
b.text().includes('dialog.group_member_moderation.cancel')
);
await cancelBtn.trigger('click');
expect(wrapper.emitted('cancel-progress')).toBeTruthy();
});

View File

@@ -54,7 +54,10 @@ describe('useGroupDialogCommands', () => {
it('returns early when dialog is not visible', () => {
const groupDialog = createGroupDialog({ visible: false });
const deps = createDeps();
const { groupDialogCommand } = useGroupDialogCommands(groupDialog, deps);
const { groupDialogCommand } = useGroupDialogCommands(
groupDialog,
deps
);
groupDialogCommand('Refresh');
expect(deps.showGroupDialog).not.toHaveBeenCalled();
@@ -63,7 +66,10 @@ describe('useGroupDialogCommands', () => {
it('Share copies group URL', () => {
const groupDialog = createGroupDialog();
const deps = createDeps();
const { groupDialogCommand } = useGroupDialogCommands(groupDialog, deps);
const { groupDialogCommand } = useGroupDialogCommands(
groupDialog,
deps
);
groupDialogCommand('Share');
expect(copyToClipboard).toHaveBeenCalledWith(
@@ -74,7 +80,10 @@ describe('useGroupDialogCommands', () => {
it('Invite To Group dispatches invite callback', () => {
const groupDialog = createGroupDialog();
const deps = createDeps();
const { groupDialogCommand } = useGroupDialogCommands(groupDialog, deps);
const { groupDialogCommand } = useGroupDialogCommands(
groupDialog,
deps
);
groupDialogCommand('Invite To Group');
expect(deps.showInviteGroupDialog).toHaveBeenCalledWith('grp_123', '');
@@ -83,7 +92,10 @@ describe('useGroupDialogCommands', () => {
it('Refresh calls showGroupDialog with forceRefresh', () => {
const groupDialog = createGroupDialog();
const deps = createDeps();
const { groupDialogCommand } = useGroupDialogCommands(groupDialog, deps);
const { groupDialogCommand } = useGroupDialogCommands(
groupDialog,
deps
);
groupDialogCommand('Refresh');
expect(deps.showGroupDialog).toHaveBeenCalledWith('grp_123', {
@@ -94,7 +106,10 @@ describe('useGroupDialogCommands', () => {
it('Block Group confirms and calls blockGroup', async () => {
const groupDialog = createGroupDialog();
const deps = createDeps();
const { groupDialogCommand } = useGroupDialogCommands(groupDialog, deps);
const { groupDialogCommand } = useGroupDialogCommands(
groupDialog,
deps
);
groupDialogCommand('Block Group');
await vi.waitFor(() => {
@@ -109,7 +124,10 @@ describe('useGroupDialogCommands', () => {
it('Unblock Group confirms and calls unblockGroup', async () => {
const groupDialog = createGroupDialog();
const deps = createDeps();
const { groupDialogCommand } = useGroupDialogCommands(groupDialog, deps);
const { groupDialogCommand } = useGroupDialogCommands(
groupDialog,
deps
);
groupDialogCommand('Unblock Group');
await vi.waitFor(() => {
@@ -129,7 +147,10 @@ describe('useGroupDialogCommands', () => {
confirm: vi.fn().mockResolvedValue({ ok: false })
}
});
const { groupDialogCommand } = useGroupDialogCommands(groupDialog, deps);
const { groupDialogCommand } = useGroupDialogCommands(
groupDialog,
deps
);
groupDialogCommand('Block Group');
await vi.waitFor(() => {

View File

@@ -233,9 +233,7 @@ describe('useGroupGalleries', () => {
.spyOn(console, 'error')
.mockImplementation(() => {});
queryRequest.fetch.mockRejectedValueOnce(
new Error('API Error')
);
queryRequest.fetch.mockRejectedValueOnce(new Error('API Error'));
await expect(
getGroupGallery('grp_1', 'g1')

View File

@@ -4,12 +4,11 @@ import { describe, expect, test, vi, beforeEach } from 'vitest';
vi.mock('vue-sonner', () => ({ toast: { success: vi.fn(), error: vi.fn() } }));
vi.mock('vue-i18n', () => ({
useI18n: () => ({
t: (key) => key
,
locale: require('vue').ref('en')
}),
t: (key) => key,
locale: require('vue').ref('en')
}),
createI18n: () => ({
global: { t: (key) => key , locale: require('vue').ref('en') },
global: { t: (key) => key, locale: require('vue').ref('en') },
install: vi.fn()
})
}));
@@ -95,11 +94,19 @@ import { queryRequest } from '../../../../api';
function createTables() {
return {
members: reactive({ data: [], pageSize: 15 }),
bans: reactive({ data: [], filters: [{ prop: ['$displayName'], value: '' }], pageSize: 15 }),
bans: reactive({
data: [],
filters: [{ prop: ['$displayName'], value: '' }],
pageSize: 15
}),
invites: reactive({ data: [], pageSize: 15 }),
joinRequests: reactive({ data: [], pageSize: 15 }),
blocked: reactive({ data: [], pageSize: 15 }),
logs: reactive({ data: [], filters: [{ prop: ['description'], value: '' }], pageSize: 15 })
logs: reactive({
data: [],
filters: [{ prop: ['description'], value: '' }],
pageSize: 15
})
};
}
@@ -167,11 +174,19 @@ describe('useGroupModerationData', () => {
userId: `usr_${i}`,
user: { displayName: `User${i}` }
}));
const page2 = [{ userId: 'usr_100', user: { displayName: 'User100' } }];
const page2 = [
{ userId: 'usr_100', user: { displayName: 'User100' } }
];
deps.groupRequest.getGroupBans
.mockResolvedValueOnce({ json: page1, params: { groupId: 'grp_test' } })
.mockResolvedValueOnce({ json: page2, params: { groupId: 'grp_test' } });
.mockResolvedValueOnce({
json: page1,
params: { groupId: 'grp_test' }
})
.mockResolvedValueOnce({
json: page2,
params: { groupId: 'grp_test' }
});
const { getAllGroupBans } = useGroupModerationData(deps);
await getAllGroupBans('grp_test');
@@ -198,12 +213,17 @@ describe('useGroupModerationData', () => {
test('handles API error gracefully', async () => {
const { toast } = await import('vue-sonner');
const deps = createDeps();
deps.groupRequest.getGroupBans.mockRejectedValue(new Error('Network error'));
deps.groupRequest.getGroupBans.mockRejectedValue(
new Error('Network error')
);
const { getAllGroupBans, isGroupMembersLoading } = useGroupModerationData(deps);
const { getAllGroupBans, isGroupMembersLoading } =
useGroupModerationData(deps);
await getAllGroupBans('grp_test');
expect(toast.error).toHaveBeenCalledWith('Failed to get group bans');
expect(toast.error).toHaveBeenCalledWith(
'Failed to get group bans'
);
expect(isGroupMembersLoading.value).toBe(false);
});
@@ -213,10 +233,16 @@ describe('useGroupModerationData', () => {
userId: `usr_${i}`
}));
deps.groupRequest.getGroupBans
.mockResolvedValueOnce({ json: page1, params: { groupId: 'grp_test' } })
.mockResolvedValueOnce({
json: page1,
params: { groupId: 'grp_test' }
})
.mockImplementation(() => {
deps.groupMemberModeration.value.visible = false;
return Promise.resolve({ json: [{ userId: 'usr_extra' }], params: { groupId: 'grp_test' } });
return Promise.resolve({
json: [{ userId: 'usr_extra' }],
params: { groupId: 'grp_test' }
});
});
const { getAllGroupBans } = useGroupModerationData(deps);
@@ -254,7 +280,10 @@ describe('useGroupModerationData', () => {
});
const { getAllGroupLogs } = useGroupModerationData(deps);
await getAllGroupLogs('grp_test', ['group.member.ban', 'group.member.kick']);
await getAllGroupLogs('grp_test', [
'group.member.ban',
'group.member.kick'
]);
expect(deps.groupRequest.getGroupLogs).toHaveBeenCalledWith(
expect.objectContaining({
@@ -281,7 +310,8 @@ describe('useGroupModerationData', () => {
params: { groupId: 'grp_test' }
});
const { getAllGroupInvitesAndJoinRequests } = useGroupModerationData(deps);
const { getAllGroupInvitesAndJoinRequests } =
useGroupModerationData(deps);
await getAllGroupInvitesAndJoinRequests('grp_test');
expect(deps.tables.invites.data).toHaveLength(1);
@@ -294,7 +324,10 @@ describe('useGroupModerationData', () => {
test('parses multiple user IDs from input', async () => {
const deps = createDeps();
deps.groupRequest.getGroupMember.mockResolvedValue({
json: { userId: 'usr_aaaa1111-2222-3333-4444-555566667777', user: { displayName: 'A' } },
json: {
userId: 'usr_aaaa1111-2222-3333-4444-555566667777',
user: { displayName: 'A' }
},
params: {}
});
@@ -344,7 +377,10 @@ describe('useGroupModerationData', () => {
const { addGroupMemberToSelection } = useGroupModerationData(deps);
await addGroupMemberToSelection('usr_1');
expect(deps.selection.setSelectedUsers).toHaveBeenCalledWith('usr_1', member);
expect(deps.selection.setSelectedUsers).toHaveBeenCalledWith(
'usr_1',
member
);
expect(queryRequest.fetch).not.toHaveBeenCalled();
});
@@ -362,11 +398,16 @@ describe('useGroupModerationData', () => {
const { addGroupMemberToSelection } = useGroupModerationData(deps);
await addGroupMemberToSelection('usr_1');
expect(queryRequest.fetch).toHaveBeenCalledWith('user.dialog', { userId: 'usr_1' });
expect(deps.selection.setSelectedUsers).toHaveBeenCalledWith('usr_1', expect.objectContaining({
userId: 'usr_1',
displayName: 'Alice'
}));
expect(queryRequest.fetch).toHaveBeenCalledWith('user.dialog', {
userId: 'usr_1'
});
expect(deps.selection.setSelectedUsers).toHaveBeenCalledWith(
'usr_1',
expect.objectContaining({
userId: 'usr_1',
displayName: 'Alice'
})
);
});
});
@@ -395,7 +436,8 @@ describe('useGroupModerationData', () => {
const deps = createDeps();
deps.tables.members.data = [{ userId: 'usr_1' }];
const { groupMembersSearch, memberSearch, isGroupMembersLoading } = useGroupModerationData(deps);
const { groupMembersSearch, memberSearch, isGroupMembersLoading } =
useGroupModerationData(deps);
memberSearch.value = 'ab';
groupMembersSearch();
@@ -405,9 +447,13 @@ describe('useGroupModerationData', () => {
test('setGroupMemberSortOrder does nothing when sort is the same', async () => {
const deps = createDeps();
deps.groupRequest.getGroupMember.mockResolvedValue({ json: null, params: {} });
deps.groupRequest.getGroupMember.mockResolvedValue({
json: null,
params: {}
});
const { setGroupMemberSortOrder, memberSortOrder } = useGroupModerationData(deps);
const { setGroupMemberSortOrder, memberSortOrder } =
useGroupModerationData(deps);
const currentSort = memberSortOrder.value;
await setGroupMemberSortOrder(currentSort);
@@ -418,7 +464,8 @@ describe('useGroupModerationData', () => {
test('setGroupMemberFilter does nothing when filter is the same', async () => {
const deps = createDeps();
const { setGroupMemberFilter, memberFilter } = useGroupModerationData(deps);
const { setGroupMemberFilter, memberFilter } =
useGroupModerationData(deps);
const currentFilter = memberFilter.value;
await setGroupMemberFilter(currentFilter);
@@ -429,7 +476,8 @@ describe('useGroupModerationData', () => {
describe('loadAllGroupMembers', () => {
test('does nothing when already loading', async () => {
const deps = createDeps();
const { loadAllGroupMembers, isGroupMembersLoading } = useGroupModerationData(deps);
const { loadAllGroupMembers, isGroupMembersLoading } =
useGroupModerationData(deps);
isGroupMembersLoading.value = true;
await loadAllGroupMembers();