fix(webui): hide archived anime from calendar

This commit is contained in:
Estrella Pan
2026-07-11 12:36:50 +02:00
parent 86e39811d1
commit be8d23c319
2 changed files with 107 additions and 4 deletions

View File

@@ -0,0 +1,104 @@
import { mount } from '@vue/test-utils';
import { createPinia, setActivePinia } from 'pinia';
import { defineComponent } from 'vue';
import type { Component } from 'vue';
import { beforeAll, beforeEach, describe, expect, it, vi } from 'vitest';
import { useBangumiStore } from '@/store/bangumi';
import { mockBangumiRule } from '@/test/mocks/api';
vi.mock('@/utils/axios', () => ({
axios: {
get: vi.fn(),
post: vi.fn(),
patch: vi.fn(),
delete: vi.fn(),
put: vi.fn(),
},
}));
vi.mock('@/hooks/useBreakpointQuery', async () => {
const { ref } = await vi.importActual<typeof import('vue')>('vue');
return {
useBreakpointQuery: () => ({ isMobile: ref(false) }),
};
});
vi.mock('@/hooks/useMyI18n', () => ({
useMyI18n: () => ({
t: (key: string) => key,
returnUserLangMsg: () => '',
}),
}));
vi.mock('@/hooks/useMessage', () => ({
useMessage: () => ({ success: vi.fn() }),
}));
const CalendarBoardStub = defineComponent({
name: 'CalendarBoard',
props: {
groupedByDay: {
type: Object,
required: true,
},
},
template: '<div data-testid="calendar-board" />',
});
describe('Calendar page', () => {
let CalendarPage: Component;
beforeAll(async () => {
vi.stubGlobal('definePage', vi.fn());
CalendarPage = (await import('./calendar.vue')).default;
});
beforeEach(() => {
setActivePinia(createPinia());
});
function mountCalendar() {
return mount(CalendarPage, {
global: {
stubs: {
'ab-icon-button': true,
'calendar-board': CalendarBoardStub,
'calendar-mobile-list': true,
'calendar-rule-list-popup': true,
},
},
});
}
it('excludes archived rules from weekday groups', () => {
const store = useBangumiStore();
store.bangumi = [
{ ...mockBangumiRule, id: 1, air_weekday: 0, archived: false },
{ ...mockBangumiRule, id: 2, air_weekday: 0, archived: true },
];
const wrapper = mountCalendar();
const groupedByDay = wrapper
.getComponent(CalendarBoardStub)
.props('groupedByDay') as Record<
string,
Array<{ rules: Array<{ id: number }> }>
>;
expect(
groupedByDay.mon.flatMap((group) => group.rules.map((rule) => rule.id))
).toEqual([1]);
});
it('shows the empty state when every rule is archived', () => {
const store = useBangumiStore();
store.bangumi = [
{ ...mockBangumiRule, id: 1, air_weekday: 0, archived: true },
];
const wrapper = mountCalendar();
expect(wrapper.find('[data-testid="calendar-board"]').exists()).toBe(false);
expect(wrapper.find('.empty-guide').exists()).toBe(true);
});
});

View File

@@ -7,7 +7,7 @@ definePage({
name: 'Calendar',
});
const { bangumi } = storeToRefs(useBangumiStore());
const { activeBangumi } = storeToRefs(useBangumiStore());
const { getAll, openEditPopup } = useBangumiStore();
const { isMobile } = useBreakpointQuery();
const { t } = useMyI18n();
@@ -71,8 +71,7 @@ const groupedBangumiByDay = computed(() => {
DAY_KEYS.forEach((key) => (itemsByDay[key] = []));
itemsByDay.unknown = [];
bangumi.value?.forEach((item) => {
if (item.deleted) return;
activeBangumi.value.forEach((item) => {
const weekday = item.air_weekday;
if (weekday != null && weekday >= 0 && weekday <= 6) {
itemsByDay[DAY_KEYS[weekday]].push(item);
@@ -90,7 +89,7 @@ const groupedBangumiByDay = computed(() => {
});
const hasBangumi = computed(() => {
return bangumi.value && bangumi.value.some((b) => !b.deleted);
return activeBangumi.value.length > 0;
});
function getDayLabel(key: string): string {