This commit is contained in:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user