Import Prices

This commit is contained in:
AzureAD\SylvainDUVERNAY
2026-05-06 14:21:51 +02:00
parent 3a0ea871c2
commit ef54b5d94b
2 changed files with 180 additions and 64 deletions

View File

@@ -93,9 +93,9 @@ class PurchaseTradeTestCase(ModuleTestCase):
'price_value': '98',
}])
self.assertEqual(stats['imported'], 0)
self.assertEqual(len(stats['imported']), 0)
self.assertEqual(len(stats['skipped']), 1)
self.assertEqual(stats['skipped'][0]['reason'], 'price_index missing')
self.assertEqual(stats['skipped'][0]['detail'], 'price_index missing')
def test_import_prices_creates_index_and_imports_new_price(self):
'import prices creates missing index when requested'
@@ -117,8 +117,8 @@ class PurchaseTradeTestCase(ModuleTestCase):
'price_value': '98',
}], create_missing_price_index=True)
self.assertEqual(stats['created_indexes'], 1)
self.assertEqual(stats['imported'], 1)
self.assertEqual(len(stats['created_indexes']), 1)
self.assertEqual(len(stats['imported']), 1)
self.assertEqual(price_model.records[0].price_index, 'LME Copper')
self.assertEqual(price_value_model.records[0].price_value, 98.0)
@@ -143,10 +143,10 @@ class PurchaseTradeTestCase(ModuleTestCase):
'price_value': '98',
}])
self.assertEqual(stats['updated'], 0)
self.assertEqual(len(stats['updated']), 0)
self.assertEqual(price_value_model.records[0].price_value, 97.0)
self.assertEqual(
stats['skipped'][0]['reason'], 'price_date already exists')
stats['skipped'][0]['detail'], 'price_date already exists')
def test_import_prices_overwrites_existing_date_when_requested(self):
'import prices updates existing price dates when requested'
@@ -169,9 +169,66 @@ class PurchaseTradeTestCase(ModuleTestCase):
'price_value': '98',
}], overwrite_existing_price=True)
self.assertEqual(stats['updated'], 1)
self.assertEqual(len(stats['updated']), 1)
self.assertEqual(price_value_model.records[0].price_value, 98.0)
def test_import_prices_collects_row_errors(self):
'import prices reports invalid row values without hiding the result'
price = SimpleNamespace(id=1, price_index='LME Copper')
price_model = _FakePriceModel([price])
price_value_model = _FakePriceValueModel()
with patch('trytond.modules.purchase_trade.pricing.Pool') as pool:
pool.return_value.get.side_effect = {
'price.price': price_model,
'price.price_value': price_value_model,
}.__getitem__
stats = ImportPrices._import_rows([{
'price_index': 'LME Copper',
'price_date': date(2026, 3, 27),
'price_value': 'not-a-number',
}])
self.assertEqual(len(stats['errors']), 1)
self.assertIn('not-a-number', stats['errors'][0]['detail'])
def test_import_prices_result_lists_all_outcome_sections(self):
'import prices formats detailed result sections'
message = ImportPrices._format_result({
'created_indexes': [{
'row': 2,
'price_index': 'LME Copper',
'price_date': None,
'detail': 'price index created',
}],
'imported': [{
'row': 2,
'price_index': 'LME Copper',
'price_date': date(2026, 3, 27),
'detail': 'price_value=98.0',
}],
'updated': [],
'skipped': [{
'row': 3,
'price_index': 'LME Copper',
'price_date': date(2026, 3, 27),
'detail': 'price_date already exists',
}],
'errors': [{
'row': 4,
'price_index': 'LME Zinc',
'price_date': 'bad-date',
'detail': 'Invalid price_date: bad-date',
}],
})
self.assertIn('Created price indexes:', message)
self.assertIn('Successfully imported prices:', message)
self.assertIn('Skipped records:', message)
self.assertIn('Errors:', message)
self.assertIn('Row 2 - LME Copper / 2026-03-27', message)
class _FakePriceModel: