Quality / test (push) Canceled after 0s
Add the admin pricing observation and valuation form, secure valuation writes with CSRF, and extend authenticated browser coverage.
28 lines
1.5 KiB
JavaScript
28 lines
1.5 KiB
JavaScript
import assert from 'node:assert/strict';
|
|
import test from 'node:test';
|
|
|
|
import { buildApp } from '../../src/app/build-app.js';
|
|
|
|
test('accepts a protected pricing observation and valuation request', async (testContext) => {
|
|
let csrfChecks = 0;
|
|
const app = buildApp({
|
|
authenticateAdmin: async () => ({ sellerId: 'seller-1' }),
|
|
authorizeUnsafeRequest: async () => { csrfChecks += 1; },
|
|
pricingService: {
|
|
async addObservation(input) { return { id: 'observation-1', ...input }; },
|
|
async calculate() { return { valuation: { id: 'valuation-1', inventoryItemId: 'inventory-1', valueMinor: 2500, currency: 'USD', strategy: 'MEDIAN', confidence: 'LOW', sourceCount: 1 }, observations: [] }; },
|
|
},
|
|
});
|
|
testContext.after(() => app.close());
|
|
|
|
const observationResponse = await app.inject({
|
|
method: 'POST', url: '/api/v1/admin/pricing/observations', headers: { 'x-csrf-token': 'csrf' },
|
|
payload: { productId: 'd2f67d74-9647-48d5-b3a4-74d3b16ea9f8', inventoryItemId: '21eb218b-7a95-4f80-a9e3-e306f7ca1f2e', providerId: 'manual', priceMinor: 2500, sourceIdentifier: 'source-1', conditionId: 'ab8150c7-96c1-4b55-8d69-7d0b77d48958' },
|
|
});
|
|
const valuationResponse = await app.inject({ method: 'POST', url: '/api/v1/admin/inventory/21eb218b-7a95-4f80-a9e3-e306f7ca1f2e/valuation' });
|
|
|
|
assert.equal(observationResponse.statusCode, 201);
|
|
assert.equal(valuationResponse.statusCode, 200);
|
|
assert.equal(valuationResponse.json().data.valueMinor, 2500);
|
|
assert.equal(csrfChecks, 2);
|
|
}); |