diff --git a/frontend/app/javascript/dashboard/routes/dashboard/captain/assistants/skills/Index.spec.js b/frontend/app/javascript/dashboard/routes/dashboard/captain/assistants/skills/Index.spec.js index 6d3dfef3..89afe267 100644 --- a/frontend/app/javascript/dashboard/routes/dashboard/captain/assistants/skills/Index.spec.js +++ b/frontend/app/javascript/dashboard/routes/dashboard/captain/assistants/skills/Index.spec.js @@ -1,4 +1,4 @@ -import { shallowMount } from '@vue/test-utils'; +import { flushPromises, shallowMount } from '@vue/test-utils'; import Index from './Index.vue'; const mocked = vi.hoisted(() => ({ @@ -11,13 +11,21 @@ const mocked = vi.hoisted(() => ({ })); vi.mock('dashboard/composables/store', async () => { - const { computed } = await vi.importActual('vue'); + const { computed, reactive } = await vi.importActual('vue'); + const state = reactive({ records: [] }); + Object.defineProperty(mocked, 'records', { + configurable: true, + get: () => state.records, + set: value => { + state.records = value; + }, + }); return { useStore: () => ({ dispatch: (...args) => mocked.dispatch(...args) }), useMapGetter: key => computed(() => key === 'captainSkills/getRecords' - ? mocked.records + ? state.records : mocked.flags ), }; @@ -87,6 +95,41 @@ describe('Assistant skills page', () => { }); }); + it('keeps the latest list when an older assistant request fails', async () => { + let rejectOldRequest; + let resolveNewRequest; + const newAssistantSkills = [ + { ...activeSkill, id: 10, name: 'Shipping', bound: true }, + ]; + mocked.dispatch = vi.fn().mockImplementation((action, params) => { + if (action !== 'captainSkills/get') return Promise.resolve([]); + if (params.assistantId === 9) { + return new Promise((_, reject) => { + rejectOldRequest = reject; + }); + } + return new Promise(resolve => { + resolveNewRequest = payload => { + mocked.records = payload; + resolve(payload); + }; + }); + }); + + const wrapper = mountPage(); + mocked.route.params.assistantId = 10; + await wrapper.vm.$nextTick(); + + resolveNewRequest(newAssistantSkills); + await Promise.resolve(); + rejectOldRequest(new Error('old assistant request failed')); + await flushPromises(); + + expect(mocked.records).toEqual(newAssistantSkills); + expect(wrapper.text()).toContain('Shipping'); + expect(wrapper.find('[role="alert"]').exists()).toBe(false); + }); + it('groups bound and available skills', () => { mocked.records = [ { ...activeSkill, bound: true },