feat: update index.html script reference and add UpdateQuote use case tests
- Updated the script reference in index.html to the latest version. - Added unit tests for the UpdateQuote use case, covering various detail line scenarios including catalog, manual, block, and legacy free detail lines.
This commit is contained in:
parent
e720c4391b
commit
7352ce924f
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
2
dist/client/index.html
vendored
2
dist/client/index.html
vendored
@ -8,7 +8,7 @@
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<link href="https://fonts.upset.dev/css2?family=Poppins&display=swap" rel="stylesheet" />
|
||||
<title>Presupuestador Uecko</title>
|
||||
<script type="module" crossorigin src="/assets/index-BxV0xeEX.js"></script>
|
||||
<script type="module" crossorigin src="/assets/index-vToibWED.js"></script>
|
||||
<link rel="stylesheet" crossorigin href="/assets/index-C6BCzFs6.css">
|
||||
</head>
|
||||
|
||||
|
||||
@ -0,0 +1,139 @@
|
||||
import { ArticleIdentifier } from "@/contexts/catalog/domain";
|
||||
import { createDealerMapper } from "@/contexts/sales/infrastructure/mappers/dealer.mapper";
|
||||
import { IUpdateQuote_Request_DTO, Note, Result, UniqueID } from "@shared/contexts";
|
||||
import { UpdateQuoteUseCase } from "./UpdateQuote.useCase";
|
||||
|
||||
const dealerId = "2b15f09e-1eaa-46eb-8a8b-673eab8e3dda";
|
||||
const quoteId = "35ea9365-f3d3-4127-ab31-7be82dcdd006";
|
||||
|
||||
const dealer = createDealerMapper({} as any).mapToDomain({
|
||||
dataValues: {
|
||||
id: dealerId,
|
||||
user_id: "46e95fed-e71d-4513-9d42-8b252aa5aa5a",
|
||||
name: "Dealer",
|
||||
status: "actived",
|
||||
lang_code: "es",
|
||||
currency_code: "EUR",
|
||||
logo: "",
|
||||
contact_information: "",
|
||||
default_payment_method: "",
|
||||
default_notes: "",
|
||||
default_legal_terms: "",
|
||||
default_quote_validity: "",
|
||||
default_show_line_discount_column: true,
|
||||
default_tax: 2100,
|
||||
default_tax_label: "% IVA",
|
||||
},
|
||||
} as any);
|
||||
|
||||
const createItem = (overrides: Record<string, unknown> = {}) => ({
|
||||
id_article: "",
|
||||
description: "Free line",
|
||||
quantity: { amount: null, scale: 2 },
|
||||
unit_price: { amount: null, scale: 2, currency_code: "EUR" },
|
||||
subtotal_price: { amount: null, scale: 2, currency_code: "EUR" },
|
||||
discount: { amount: null, scale: 2 },
|
||||
total_price: { amount: null, scale: 2, currency_code: "EUR" },
|
||||
...overrides,
|
||||
});
|
||||
|
||||
const quoteDTO: IUpdateQuote_Request_DTO = {
|
||||
status: "draft",
|
||||
date: "2026-10-09T00:00:00.000Z",
|
||||
reference: "UEXX-0023",
|
||||
customer_reference: "Customer reference",
|
||||
customer_information: "Customer information",
|
||||
lang_code: "es",
|
||||
currency_code: "EUR",
|
||||
payment_method: "50% on acceptance",
|
||||
notes: "Notes",
|
||||
validity: "60 days",
|
||||
show_line_discount_column: true,
|
||||
subtotal_price: { amount: 0, scale: 2, currency_code: "EUR" },
|
||||
discount: { amount: 0, scale: 2 },
|
||||
tax: { amount: 2100, scale: 2 },
|
||||
total_price: { amount: 0, scale: 2, currency_code: "EUR" },
|
||||
dealer_id: dealerId,
|
||||
items: [
|
||||
createItem({
|
||||
id_article: "101",
|
||||
description: "Catalog article",
|
||||
quantity: { amount: 100, scale: 2 },
|
||||
unit_price: { amount: 1299, scale: 2, currency_code: "EUR" },
|
||||
}),
|
||||
createItem({ description: "Manually entered line" }),
|
||||
createItem({
|
||||
description: "BLOCK TITLE\nBlock detail one\r\nBlock detail two",
|
||||
}),
|
||||
(() => {
|
||||
const { id_article: _idArticle, ...legacyItem } = createItem({
|
||||
description: "Legacy block without article identifier",
|
||||
});
|
||||
return legacyItem;
|
||||
})() as any,
|
||||
],
|
||||
};
|
||||
|
||||
describe("UpdateQuoteUseCase detail lines", () => {
|
||||
const quoteRepo = {
|
||||
getById: jest.fn(),
|
||||
update: jest.fn(),
|
||||
};
|
||||
const catalogArticles = {
|
||||
execute: jest.fn(),
|
||||
};
|
||||
const adapter = {
|
||||
startTransaction: () => ({
|
||||
complete: async (callback: (transaction: unknown) => Promise<void>) => callback({}),
|
||||
}),
|
||||
};
|
||||
const repositoryManager = {
|
||||
getRepository: () => () => quoteRepo,
|
||||
};
|
||||
|
||||
beforeEach(() => {
|
||||
jest.clearAllMocks();
|
||||
quoteRepo.getById.mockResolvedValue({
|
||||
showLineDiscountColumn: true,
|
||||
taxLabel: Note.create("% IVA").object,
|
||||
});
|
||||
quoteRepo.update.mockResolvedValue(undefined);
|
||||
catalogArticles.execute.mockResolvedValue(
|
||||
Result.ok([{ idArticle: ArticleIdentifier.create("101").object }])
|
||||
);
|
||||
});
|
||||
|
||||
it("saves catalog, manual, block, and legacy free detail lines", async () => {
|
||||
const useCase = new UpdateQuoteUseCase(
|
||||
{
|
||||
adapter: adapter as any,
|
||||
repositoryManager: repositoryManager as any,
|
||||
dealer,
|
||||
catalogArticles: catalogArticles as any,
|
||||
} as any
|
||||
);
|
||||
|
||||
const result = await useCase.execute({
|
||||
id: UniqueID.create(quoteId).object,
|
||||
quoteDTO,
|
||||
});
|
||||
|
||||
expect(result.isSuccess).toBe(true);
|
||||
expect(catalogArticles.execute).toHaveBeenCalledTimes(1);
|
||||
expect(catalogArticles.execute.mock.calls[0][0].map((id: ArticleIdentifier) => id.toString())).toEqual([
|
||||
"101",
|
||||
]);
|
||||
expect(quoteRepo.update).toHaveBeenCalledTimes(1);
|
||||
|
||||
const savedQuote = quoteRepo.update.mock.calls[0][0];
|
||||
expect(savedQuote.items.toArray().map((item: { idArticle: ArticleIdentifier }) => item.idArticle.toString())).toEqual([
|
||||
"101",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
]);
|
||||
expect(savedQuote.items.toArray()[2].description.toString()).toBe(
|
||||
"BLOCK TITLE\nBlock detail one\r\nBlock detail two"
|
||||
);
|
||||
});
|
||||
});
|
||||
Loading…
Reference in New Issue
Block a user