rebuild source discovery workflows
CI / compose (push) Failing after 5m46s

This commit is contained in:
Marco0300
2026-09-04 20:52:37 +02:00
parent 3a9b553440
commit 6aefbdc1f3
18 changed files with 853 additions and 106 deletions
+40
View File
@@ -84,6 +84,46 @@ class ScopedDiscoveryApiTests(unittest.TestCase):
run = self.request('GET', '/api/v1/discovery-runs')[1]['items'][0]
self.assertEqual(run['seed_urls'], []); self.assertEqual(run['result']['candidates'][0]['provenance']['mechanism'], 'criteria_search_provider')
def test_selected_disabled_source_is_rejected_before_job_creation(self):
status, source = self.request('POST', '/api/v1/sources', {
'name': 'Disabled manual', 'kind': 'manual',
'config': {'rows': [{'name': 'Not runnable'}]},
})
self.assertEqual(status, 201)
status, body = self.request('POST', '/api/v1/discovery', {
'criteria': {'category': 'plumbers'}, 'source_ids': [source['id']],
'idempotency_key': 'disabled-source',
})
self.assertEqual(status, 409)
self.assertEqual(body['error'], 'selected_source_not_ready')
self.assertEqual(self.request('GET', '/api/v1/discovery-runs')[1]['items'], [])
def test_source_dry_run_validates_enabled_source_without_persisting_candidates(self):
status, source = self.request('POST', '/api/v1/sources', {
'name': 'Preview manual', 'kind': 'manual', 'enabled': True,
'config': {'rows': [{'name': 'Preview Plumbing', 'website': 'https://preview.example.test'}]},
})
self.assertEqual(status, 201)
with patch('app.main.enrich_source_business') as enrich:
status, job = self.request('POST', '/api/v1/discovery', {
'criteria': {'category': 'plumbers', 'city': 'Cape Town'},
'source_ids': [source['id']], 'dry_run': True,
'idempotency_key': 'source-dry-run', 'max_candidates': 5,
})
self.assertEqual(status, 202)
for _ in range(100):
_, current = self.request('GET', '/api/v1/jobs/' + str(job['id']))
if current['status'] in ('succeeded', 'failed'):
break
time.sleep(.02)
self.assertEqual(current['status'], 'succeeded')
self.assertFalse(enrich.called)
self.assertEqual(self.request('GET', '/api/v1/businesses')[1]['items'], [])
self.assertEqual(self.request('GET', '/api/v1/source-records')[1]['items'], [])
run = self.request('GET', '/api/v1/discovery-runs')[1]['items'][0]
self.assertTrue(run['dry_run'])
self.assertEqual(run['result_count'], 1)
def test_results_are_tenant_isolated(self):
ph, salt = hash_password('other-password')
db = sqlite3.connect(self.server.db_path); db.execute("INSERT INTO organizations VALUES ('other-tenant','Other',CURRENT_TIMESTAMP)"); db.execute("INSERT INTO users (organization_id,email,password_hash,password_salt,role) VALUES (?,?,?,?,?)", ('other-tenant','other@example.test',ph,salt,'owner')); db.commit(); db.close()