Skip to content

Commit 35875dd

Browse files
authored
Merge pull request #520 from Police-Data-Accessibility-Project/mc_519_get_data_sources_bug
Fix bug in data sources and meta URL GET queries
2 parents 3b1feb3 + a952f1d commit 35875dd

File tree

8 files changed

+62
-19
lines changed

8 files changed

+62
-19
lines changed

src/api/endpoints/data_source/get/query.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ async def run(self, session: AsyncSession) -> DataSourceGetOuterResponse:
3737
# Required Attributes
3838
URL.name,
3939
URLRecordType.record_type,
40-
URL.confirmed_agencies,
4140

4241
# Optional Attributes
4342
URL.description,
@@ -102,7 +101,7 @@ async def run(self, session: AsyncSession) -> DataSourceGetOuterResponse:
102101

103102
url_description: str | None = mapping[URL.description]
104103
link_batch_url_batch_id: int | None = mapping[LinkBatchURL.batch_id]
105-
url_record_formats: list[str] | None = mapping[URLOptionalDataSourceMetadata.record_formats]
104+
url_record_formats: list[str] = mapping[URLOptionalDataSourceMetadata.record_formats] or []
106105
url_data_portal_type: str | None = mapping[URLOptionalDataSourceMetadata.data_portal_type]
107106
url_supplying_entity: str | None = mapping[URLOptionalDataSourceMetadata.supplying_entity]
108107
url_coverage_start: date | None = mapping[URLOptionalDataSourceMetadata.coverage_start]
@@ -118,7 +117,7 @@ async def run(self, session: AsyncSession) -> DataSourceGetOuterResponse:
118117
url_scraper_url: str | None = mapping[URLOptionalDataSourceMetadata.scraper_url]
119118
url_submission_notes: str | None = mapping[URLOptionalDataSourceMetadata.submission_notes]
120119
url_access_notes: str | None = mapping[URLOptionalDataSourceMetadata.access_notes]
121-
url_access_types: list[AccessTypeEnum] | None = mapping[URLOptionalDataSourceMetadata.access_types]
120+
url_access_types: list[AccessTypeEnum] = mapping[URLOptionalDataSourceMetadata.access_types] or []
122121

123122
responses.append(
124123
DataSourceGetResponse(

src/api/endpoints/meta_url/get/query.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ async def run(self, session: AsyncSession) -> MetaURLGetOuterResponse:
3030

3131
# Required Attributes
3232
URL.name,
33-
URL.confirmed_agencies,
3433

3534
# Optional Attributes
3635
URL.description,

tests/automated/integration/readonly/api/agencies/get/test_root.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ async def test_agency_get(
1212
responses_raw: list[dict] = readonly_helper.api_test_helper.request_validator.get_v3(
1313
url=f"/agencies",
1414
)
15-
assert len(responses_raw) == 1
15+
assert len(responses_raw) == 2
1616
response_raw = responses_raw[0]
1717
assert response_raw["id"] == readonly_helper.agency_1_id
1818
assert response_raw["name"] == "Agency 1"

tests/automated/integration/readonly/api/data_sources/test_get.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,13 @@ async def test_get(readonly_helper: ReadOnlyTestHelper):
1818
)
1919
outer_response = DataSourceGetOuterResponse(**raw_json)
2020

21-
assert len(outer_response.results) == 1
21+
assert len(outer_response.results) == 2
2222
response: DataSourceGetResponse = outer_response.results[0]
2323

2424
diff = DeepDiff(
2525
response.model_dump(mode='json'),
2626
DataSourceGetResponse(
27-
url_id=readonly_helper.url_data_source_id,
27+
url_id=readonly_helper.maximal_data_source,
2828
url="read-only-ds.com",
2929

3030
name="Read only URL name",

tests/automated/integration/readonly/api/meta_urls/agencies/test_forbid.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
@pytest.mark.asyncio
99
async def test_forbid(readonly_helper: ReadOnlyTestHelper):
1010
check_forbidden_url_type(
11-
route=f"/meta-urls/{readonly_helper.url_data_source_id}/agencies",
11+
route=f"/meta-urls/{readonly_helper.minimal_data_source}/agencies",
1212
api_test_helper=readonly_helper.api_test_helper,
1313
method="GET"
1414
)

tests/automated/integration/readonly/conftest.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
from sqlalchemy import Engine
77
from starlette.testclient import TestClient
88

9-
from src.db.helpers.connect import get_postgres_connection_string
109
from tests.automated.integration.api._helpers.RequestValidator import RequestValidator
1110
from tests.automated.integration.readonly.helper import ReadOnlyTestHelper
1211
from tests.automated.integration.readonly.setup import setup_readonly_data
@@ -45,6 +44,8 @@ async def readonly_helper(
4544
db_data_creator=db_data_creator,
4645
)
4746

48-
helper: ReadOnlyTestHelper = await setup_readonly_data(api_test_helper=api_test_helper)
47+
helper: ReadOnlyTestHelper = await setup_readonly_data(
48+
api_test_helper=api_test_helper
49+
)
4950

5051
yield helper

tests/automated/integration/readonly/helper.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ class Config:
1313

1414
agency_1_id: int
1515
agency_1_location_id: int
16+
agency_2_id: int
17+
agency_2_location_id: int
1618

17-
url_data_source_id: int
19+
minimal_data_source: int
20+
maximal_data_source: int
1821
url_meta_url_id: int

tests/automated/integration/readonly/setup.py

Lines changed: 49 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
from src.db.models.impl.url.record_type.sqlalchemy import URLRecordType
1616
from tests.automated.integration.readonly.helper import ReadOnlyTestHelper
1717
from tests.helpers.api_test_helper import APITestHelper
18-
from tests.helpers.counter import next_int
1918
from tests.helpers.data_creator.core import DBDataCreator
2019
from tests.helpers.data_creator.models.creation_info.county import CountyCreationInfo
2120
from tests.helpers.data_creator.models.creation_info.locality import LocalityCreationInfo
@@ -33,7 +32,6 @@ async def setup_readonly_data(
3332
name="Pennsylvania",
3433
iso="PA"
3534
)
36-
3735
allegheny_county: CountyCreationInfo = await db_data_creator.create_county(
3836
state_id=pennsylvania.us_state_id,
3937
name="Allegheny"
@@ -46,10 +44,18 @@ async def setup_readonly_data(
4644

4745

4846
# Add Agencies
49-
agency_1_id: int = await add_agency(adb_client, pittsburgh)
47+
agency_1_id: int = await add_agency(adb_client, pittsburgh.location_id)
48+
agency_2_id: int = await add_agency(adb_client, allegheny_county.location_id)
5049

5150
# Add Data Source With Linked Agency
52-
url_data_source_id: int = await add_data_source(agency_1_id, db_data_creator)
51+
maximal_data_source: int = await add_maximal_data_source(
52+
agency_1_id=agency_1_id,
53+
db_data_creator=db_data_creator
54+
)
55+
minimal_data_source: int = await add_minimal_data_source(
56+
agency_1_id=agency_1_id,
57+
db_data_creator=db_data_creator
58+
)
5359

5460
# Add Meta URL with Linked Agency
5561
url_meta_url_id: int = await add_meta_url(agency_1_id, db_data_creator)
@@ -61,7 +67,11 @@ async def setup_readonly_data(
6167
agency_1_id=agency_1_id,
6268
agency_1_location_id=pittsburgh.location_id,
6369

64-
url_data_source_id=url_data_source_id,
70+
agency_2_id=agency_2_id,
71+
agency_2_location_id=allegheny_county.location_id,
72+
73+
maximal_data_source=maximal_data_source,
74+
minimal_data_source=minimal_data_source,
6575
url_meta_url_id=url_meta_url_id,
6676
)
6777

@@ -93,7 +103,7 @@ async def add_meta_url(
93103
return url_id
94104

95105

96-
async def add_data_source(
106+
async def add_maximal_data_source(
97107
agency_1_id: int,
98108
db_data_creator: DBDataCreator
99109
) -> int:
@@ -150,10 +160,41 @@ async def add_data_source(
150160
)
151161
return url_id
152162

163+
async def add_minimal_data_source(
164+
agency_1_id: int,
165+
db_data_creator: DBDataCreator
166+
) -> int:
167+
adb_client: AsyncDatabaseClient = db_data_creator.adb_client
168+
url = URL(
169+
scheme="https",
170+
url="minimal-ds.com",
171+
name="Minimal name",
172+
trailing_slash=False,
173+
collector_metadata={},
174+
status=URLStatus.OK,
175+
source=URLSource.ROOT_URL,
176+
)
177+
url_id: int = await adb_client.add(url, return_id=True)
178+
await db_data_creator.create_validated_flags(
179+
url_ids=[url_id],
180+
validation_type=URLType.DATA_SOURCE
181+
)
182+
record_type = URLRecordType(
183+
url_id=url_id,
184+
record_type=RecordType.POLICIES_AND_CONTRACTS
185+
)
186+
await adb_client.add(record_type)
187+
188+
await db_data_creator.create_url_agency_links(
189+
url_ids=[url_id],
190+
agency_ids=[agency_1_id]
191+
)
192+
return url_id
193+
153194

154195
async def add_agency(
155196
adb_client: AsyncDatabaseClient,
156-
pittsburgh: LocalityCreationInfo
197+
location_id: int
157198
) -> int:
158199
agency_1 = Agency(
159200
name="Agency 1",
@@ -164,7 +205,7 @@ async def add_agency(
164205
# Add Agency location
165206
agency_1_location = LinkAgencyLocation(
166207
agency_id=agency_id,
167-
location_id=pittsburgh.location_id,
208+
location_id=location_id,
168209
)
169210
await adb_client.add(agency_1_location)
170211
return agency_id

0 commit comments

Comments
 (0)