2026-04-10 15:43:39 +02:00
|
|
|
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
|
|
|
|
2026-05-01 23:35:39 +02:00
|
|
|
const markStockGoneMock = vi.fn();
|
2026-04-10 15:43:39 +02:00
|
|
|
const getStockEntryMock = vi.fn();
|
2026-04-12 23:00:06 +02:00
|
|
|
const listGroupedStockEntriesMock = vi.fn();
|
2026-04-10 15:43:39 +02:00
|
|
|
|
|
|
|
|
vi.mock('../../../src/api/stock.js', () => ({
|
2026-05-01 23:35:39 +02:00
|
|
|
markStockGone: (...args) => markStockGoneMock(...args),
|
2026-04-10 15:43:39 +02:00
|
|
|
getStockEntry: (...args) => getStockEntryMock(...args),
|
|
|
|
|
adjustStockEntry: vi.fn(),
|
2026-04-11 10:14:49 +02:00
|
|
|
lookupItemDetails: vi.fn(),
|
|
|
|
|
patchStockItem: vi.fn(),
|
2026-04-10 15:43:39 +02:00
|
|
|
listStockEntries: vi.fn(),
|
2026-04-12 23:00:06 +02:00
|
|
|
listGroupedStockEntries: (...args) => listGroupedStockEntriesMock(...args),
|
2026-04-10 15:43:39 +02:00
|
|
|
updateStockItem: vi.fn(),
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
vi.mock('../../../src/api/locations.js', () => ({
|
|
|
|
|
fetchLocations: vi.fn(async () => ({ flat: [], tree: [] })),
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
const { stockDetailPageData } = await import('../../../src/features/stock/stock-detail-page.js');
|
|
|
|
|
const { stockListPageData } = await import('../../../src/features/stock/stock-list-page.js');
|
|
|
|
|
|
|
|
|
|
describe('stock mark-gone behavior', () => {
|
|
|
|
|
beforeEach(() => {
|
2026-05-01 23:35:39 +02:00
|
|
|
markStockGoneMock.mockReset();
|
2026-04-10 15:43:39 +02:00
|
|
|
getStockEntryMock.mockReset();
|
2026-04-12 23:00:06 +02:00
|
|
|
listGroupedStockEntriesMock.mockReset();
|
2026-04-10 15:43:39 +02:00
|
|
|
globalThis.window = {
|
|
|
|
|
__loncApp: {
|
|
|
|
|
navigate: vi.fn(),
|
|
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
afterEach(() => {
|
|
|
|
|
vi.restoreAllMocks();
|
|
|
|
|
delete globalThis.window;
|
|
|
|
|
});
|
|
|
|
|
|
2026-05-01 23:35:39 +02:00
|
|
|
it('stock detail markGone posts gone event and shows info for already gone', async () => {
|
|
|
|
|
markStockGoneMock.mockResolvedValueOnce({ status: 'already_gone' });
|
2026-04-10 15:43:39 +02:00
|
|
|
const addAlert = vi.fn();
|
|
|
|
|
const data = stockDetailPageData({ addAlert });
|
|
|
|
|
data.entry = { uuid_b64: 'item-1', name: 'Rice' };
|
|
|
|
|
|
|
|
|
|
await data.markGone();
|
|
|
|
|
|
2026-05-01 23:35:39 +02:00
|
|
|
expect(markStockGoneMock).toHaveBeenCalledWith({ addAlert }, 'item-1', 'consumed');
|
2026-04-10 15:43:39 +02:00
|
|
|
expect(addAlert).toHaveBeenCalledWith({
|
|
|
|
|
type: 'info',
|
|
|
|
|
message: 'Rice was already out of stock.',
|
|
|
|
|
});
|
|
|
|
|
expect(globalThis.window.__loncApp.navigate).toHaveBeenCalledWith('/stock');
|
|
|
|
|
});
|
|
|
|
|
|
2026-05-01 23:35:39 +02:00
|
|
|
it('stock list markGone removes entry and posts gone event', async () => {
|
|
|
|
|
markStockGoneMock.mockResolvedValueOnce({ status: 'ok' });
|
2026-04-10 15:43:39 +02:00
|
|
|
const addAlert = vi.fn();
|
|
|
|
|
const data = stockListPageData({ addAlert, isConnected: false });
|
|
|
|
|
data.entries = [{ id: 1, uuid_b64: 'item-1', name: 'Flour' }];
|
|
|
|
|
data.editForms = { 1: { level: 'plenty', quantity: 1 } };
|
|
|
|
|
data.editErrors = {};
|
|
|
|
|
|
|
|
|
|
await data.markGone(data.entries[0]);
|
|
|
|
|
|
2026-05-01 23:35:39 +02:00
|
|
|
expect(markStockGoneMock).toHaveBeenCalledWith({ addAlert, isConnected: false }, 'item-1', 'consumed');
|
2026-04-10 15:43:39 +02:00
|
|
|
expect(data.entries).toEqual([]);
|
|
|
|
|
expect(addAlert).toHaveBeenCalledWith({
|
|
|
|
|
type: 'success',
|
2026-05-01 23:35:39 +02:00
|
|
|
message: 'Flour was marked used and removed from the list.',
|
2026-04-10 15:43:39 +02:00
|
|
|
});
|
|
|
|
|
});
|
2026-04-12 13:05:14 +02:00
|
|
|
|
|
|
|
|
it('stock list grouped markGone removes item from grouped and flat collections', async () => {
|
2026-05-01 23:35:39 +02:00
|
|
|
markStockGoneMock.mockResolvedValueOnce({ status: 'ok' });
|
2026-04-12 23:00:06 +02:00
|
|
|
listGroupedStockEntriesMock.mockResolvedValueOnce([]);
|
2026-04-12 13:05:14 +02:00
|
|
|
const addAlert = vi.fn();
|
2026-04-12 23:00:06 +02:00
|
|
|
const store = { addAlert, isConnected: true };
|
|
|
|
|
const data = stockListPageData(store);
|
|
|
|
|
data.groupedLoaded = true;
|
2026-04-12 13:05:14 +02:00
|
|
|
|
|
|
|
|
data.groupedEntries = [
|
|
|
|
|
{
|
|
|
|
|
id: 10,
|
|
|
|
|
uuid_b64: 'group-10',
|
|
|
|
|
name: 'Beans',
|
|
|
|
|
stock_type: 'measured',
|
|
|
|
|
location_initial_uuid_b64: null,
|
|
|
|
|
date: '2026-04-12',
|
|
|
|
|
expire_date: '2026-04-20',
|
|
|
|
|
items: [
|
|
|
|
|
{
|
|
|
|
|
id: 11,
|
|
|
|
|
uuid_b64: 'item-11',
|
|
|
|
|
name: 'Beans',
|
|
|
|
|
stock_type: 'measured',
|
|
|
|
|
quantity: 1,
|
|
|
|
|
location_initial_uuid_b64: null,
|
|
|
|
|
date: '2026-04-12',
|
|
|
|
|
expire_date: '2026-04-20',
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
].map((group) => data.indexGroup(group));
|
|
|
|
|
data.entries = [
|
|
|
|
|
data.indexEntry({
|
|
|
|
|
id: 11,
|
|
|
|
|
uuid_b64: 'item-11',
|
|
|
|
|
name: 'Beans',
|
|
|
|
|
stock_type: 'measured',
|
|
|
|
|
quantity: 1,
|
|
|
|
|
location_initial_uuid_b64: null,
|
|
|
|
|
date: '2026-04-12',
|
|
|
|
|
expire_date: '2026-04-20',
|
|
|
|
|
}),
|
|
|
|
|
];
|
|
|
|
|
data.entriesVersion = 1;
|
|
|
|
|
data.groupedVersion = 1;
|
|
|
|
|
data.editForms = { 11: { level: 'plenty', quantity: 1 } };
|
|
|
|
|
data.editErrors = {};
|
|
|
|
|
|
|
|
|
|
await data.markGoneFromGroup(data.groupedEntries[0].items[0], data.groupedEntries[0]);
|
|
|
|
|
|
|
|
|
|
expect(data.entries).toEqual([]);
|
|
|
|
|
expect(data.groupedEntries).toEqual([]);
|
|
|
|
|
expect(addAlert).toHaveBeenCalledWith({
|
|
|
|
|
type: 'success',
|
2026-05-01 23:35:39 +02:00
|
|
|
message: 'Beans was marked used and removed from the group.',
|
2026-04-12 13:05:14 +02:00
|
|
|
});
|
2026-04-12 23:00:06 +02:00
|
|
|
expect(listGroupedStockEntriesMock).toHaveBeenCalledTimes(1);
|
|
|
|
|
expect(listGroupedStockEntriesMock).toHaveBeenCalledWith(store, { expanded: 0 });
|
2026-04-12 13:05:14 +02:00
|
|
|
});
|
2026-04-10 15:43:39 +02:00
|
|
|
});
|