feat: add local fixture pricing provider
Quality / test (push) Canceled after 0s

This commit is contained in:
2026-09-09 14:02:03 -04:00
parent 0ffccf6617
commit a3f35c8cd1
9 changed files with 53 additions and 3 deletions
+6 -1
View File
@@ -47,6 +47,8 @@ import { createPricingService } from '../modules/pricing/services/pricing-servic
import { createPricingRefreshJobRepository } from '../modules/pricing/repositories/pricing-refresh-job-repository.js';
import { createProviderMappingRepository } from '../modules/pricing/repositories/provider-mapping-repository.js';
import { createProviderMappingService } from '../modules/pricing/services/provider-mapping-service.js';
import { createPricingProviderRegistry } from '../modules/pricing/providers/pricing-provider.js';
import { createFixturePricingProvider } from '../modules/pricing/providers/fixture-pricing-provider.js';
function parsePort(value) {
const port = Number.parseInt(value ?? '3000', 10);
@@ -75,6 +77,9 @@ async function startServer() {
const pricingRepository = createPricingRepository(database.db);
const pricingRefreshJobRepository = createPricingRefreshJobRepository(database.db);
const providerMappingRepository = createProviderMappingRepository(database.db);
const pricingProviders = process.env.PRICING_FIXTURE_PROVIDER_ENABLED === 'true'
? createPricingProviderRegistry([createFixturePricingProvider()])
: createPricingProviderRegistry();
const userRepository = createUserRepository(database.db);
const sessionRepository = createSessionRepository(database.db);
const passwordResetRepository = createPasswordResetRepository(database.db);
@@ -139,7 +144,7 @@ async function startServer() {
saleService: createSaleService({ saleRepository }),
acquisitionService: createAcquisitionService({ acquisitionRepository }),
}),
pricingService: createPricingService({ pricingRepository, pricingRefreshJobRepository, providerMappingRepository }),
pricingService: createPricingService({ pricingRepository, pricingRefreshJobRepository, providerMappingRepository, pricingProviderRegistry: pricingProviders }),
providerMappingService: createProviderMappingService({ providerMappingRepository }),
publicListingService: createPublicListingService({ listingRepository, publicImageService }),
productService: createProductService({ productRepository }),
@@ -0,0 +1,18 @@
import { createPricingProvider } from './pricing-provider.js';
export function createFixturePricingProvider() {
return createPricingProvider({
id: 'fixture-provider',
async observe({ productId, inventoryItemId, conditionId }) {
return [{
productId,
inventoryItemId,
conditionId,
priceMinor: 2500,
currency: 'USD',
sourceIdentifier: `fixture-${inventoryItemId}`,
qualityScore: 50,
}];
},
});
}
@@ -2,6 +2,7 @@ import assert from 'node:assert/strict';
import test from 'node:test';
import { createPricingProvider, createPricingProviderRegistry } from '../../src/modules/pricing/providers/pricing-provider.js';
import { createFixturePricingProvider } from '../../src/modules/pricing/providers/fixture-pricing-provider.js';
test('registers pricing providers behind a validated adapter contract', async () => {
const provider = createPricingProvider({
@@ -19,4 +20,19 @@ test('rejects malformed provider adapters and responses', async () => {
assert.throws(() => createPricingProvider({ id: 'broken' }), /observe function is required/);
const provider = createPricingProvider({ id: 'broken', async observe() { return null; } });
await assert.rejects(() => provider.observe({}), /must return an observation array/);
});
test('fixture provider returns deterministic normalized observations', async () => {
const [observation] = await createFixturePricingProvider().observe({
productId: 'product-1', inventoryItemId: 'item-1', conditionId: 'condition-1',
});
assert.deepEqual(observation, {
productId: 'product-1',
inventoryItemId: 'item-1',
conditionId: 'condition-1',
priceMinor: 2500,
currency: 'USD',
sourceIdentifier: 'fixture-item-1',
qualityScore: 50,
});
});