Skip to content

Commit 7234615

Browse files
authored
Markdown in column descriptions (#247)
* Add a test for table details * Extend selenium test to navigate to table details * Process markdown in column descriptions
1 parent 06a53aa commit 7234615

File tree

5 files changed

+63
-6
lines changed

5 files changed

+63
-6
lines changed

templates/details_table.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ <h2 class="govuk-heading-s govuk-!-margin-top-3">
8989
{% for column in table.column_details %}
9090
<tr class="govuk-table__row">
9191
<td class="govuk-table__cell">{{column.name}}</td>
92-
<td class="govuk-table__cell">{{column.description|default:''}}</td>
92+
<td class="govuk-table__cell column-description">{{column.description|default:''|markdown}}</td>
9393
<td class="govuk-table__cell">{{column.type|title}}</td>
9494
<td class="govuk-table__cell">{{column.nullable|yesno|upper}}</td>
9595
</tr>

tests/conftest.py

+18-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
import pytest
66
from data_platform_catalogue.client import BaseCatalogueClient
7-
from data_platform_catalogue.entities import TableMetadata, RelationshipType
7+
from data_platform_catalogue.entities import RelationshipType, TableMetadata
88
from data_platform_catalogue.search_types import (
99
FacetOption,
1010
ResultType,
@@ -20,7 +20,7 @@
2020
from faker import Faker
2121

2222
from home.forms.search import SearchForm
23-
from home.service.details import DataProductDetailsService, DatabaseDetailsService
23+
from home.service.details import DatabaseDetailsService, DataProductDetailsService
2424
from home.service.glossary import GlossaryService
2525
from home.service.search import SearchService
2626

@@ -140,6 +140,7 @@ def mock_catalogue():
140140
page_results=generate_page(page_size=1, result_type=ResultType.TABLE),
141141
total_results=1,
142142
)
143+
mock_get_table_details_response(mock_catalogue)
143144

144145
yield mock_catalogue
145146

@@ -153,6 +154,21 @@ def mock_list_database_tables_response(mock_catalogue, total_results, page_resul
153154
mock_catalogue.list_database_tables.return_value = search_response
154155

155156

157+
def mock_get_table_details_response(mock_catalogue):
158+
mock_catalogue.get_table_details.return_value = TableMetadata(
159+
name="abc",
160+
description="abc",
161+
retention_period_in_days=0,
162+
column_details=[
163+
{
164+
"name": "foo",
165+
"description": "description **with markdown**",
166+
"type": "string",
167+
}
168+
],
169+
)
170+
171+
156172
def mock_search_response(mock_catalogue, total_results=0, page_results=()):
157173
search_response = SearchResponse(
158174
total_results=total_results, page_results=page_results

tests/selenium/conftest.py

+21-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from selenium.webdriver.remote.webelement import WebElement
1212
from selenium.webdriver.support.select import Select
1313

14-
TMP_DIR = Path(__file__).parent / "../../tmp"
14+
TMP_DIR = (Path(__file__).parent / "../../tmp").resolve()
1515

1616

1717
@pytest.fixture(scope="session")
@@ -53,6 +53,7 @@ def screenshotter(request, selenium: RemoteWebDriver):
5353

5454
elif ("call" not in report) or report["call"].failed:
5555
timestamp = datetime.datetime.now().strftime(r"%Y%m%d%H%M%S")
56+
TMP_DIR.mkdir(exist_ok=True)
5657
path = str(TMP_DIR / f"{timestamp}-{testname}-failed.png")
5758
total_height = selenium.execute_script(
5859
"return document.body.parentNode.scrollHeight"
@@ -80,6 +81,20 @@ def data_product_details(self):
8081
def data_product_tables(self):
8182
return self.selenium.find_element(By.TAG_NAME, "table")
8283

84+
def table_link(self):
85+
return self.selenium.find_element(By.LINK_TEXT, "Table details")
86+
87+
88+
class TableDetailsPage(Page):
89+
def caption(self):
90+
return self.selenium.find_element(By.CSS_SELECTOR, ".govuk-caption-m").text
91+
92+
def column_descriptions(self):
93+
return [
94+
c.text
95+
for c in self.selenium.find_elements(By.CSS_SELECTOR, ".column-description")
96+
]
97+
8398

8499
class HomePage(Page):
85100
def search_nav_link(self) -> WebElement:
@@ -222,3 +237,8 @@ def search_page(selenium) -> SearchPage:
222237
@pytest.fixture
223238
def details_data_product_page(selenium) -> DataProductDetailsPage:
224239
return DataProductDetailsPage(selenium)
240+
241+
242+
@pytest.fixture
243+
def table_details_page(selenium) -> TableDetailsPage:
244+
return TableDetailsPage(selenium)

tests/selenium/test_search_scenarios.py

+15-2
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,15 @@ def setup(
2323
home_page,
2424
search_page,
2525
details_data_product_page,
26+
table_details_page,
2627
chromedriver_path,
2728
):
2829
self.selenium = selenium
2930
self.live_server_url = live_server.url
3031
self.home_page = home_page
3132
self.search_page = search_page
3233
self.details_data_product_page = details_data_product_page
34+
self.table_details_page = table_details_page
3335
self.chromedriver_path = chromedriver_path
3436

3537
def verify_glossary_link_from_homepage_works(self):
@@ -199,9 +201,9 @@ def test_automated_accessibility_search(self):
199201
self.selenium.current_url, chromedriver_path=self.chromedriver_path
200202
)
201203

202-
def test_search_to_data_product_details(self, mock_catalogue):
204+
def test_search_to_details(self, mock_catalogue):
203205
"""
204-
Users can search a data product and got to its details page
206+
Users can search and drill down into details
205207
"""
206208
mock_search_response(
207209
mock_catalogue=mock_catalogue,
@@ -214,6 +216,8 @@ def test_search_to_data_product_details(self, mock_catalogue):
214216
self.verify_i_am_on_the_details_page(item_name)
215217
self.verify_data_product_details()
216218
self.verify_data_product_tables_listed()
219+
self.click_on_table()
220+
self.verify_i_am_on_the_table_details_page()
217221

218222
def start_on_the_home_page(self):
219223
self.selenium.get(f"{self.live_server_url}")
@@ -338,3 +342,12 @@ def verify_data_product_tables_listed(self):
338342
def verify_data_product_details(self):
339343
data_product_details = self.details_data_product_page.data_product_details()
340344
assert data_product_details.text
345+
346+
def click_on_table(self):
347+
self.details_data_product_page.table_link().click()
348+
349+
def verify_i_am_on_the_table_details_page(self):
350+
assert self.table_details_page.caption() == "Table"
351+
assert self.table_details_page.column_descriptions() == [
352+
"description with markdown"
353+
]

tests/test_views.py

+8
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,14 @@ def test_details_data_product_not_found(self, client, mock_catalogue):
5656
assert response.status_code == 404
5757

5858

59+
class TestTableView:
60+
def test_table(self, client):
61+
response = client.get(
62+
reverse("home:details", kwargs={"id": "fake", "result_type": "table"})
63+
)
64+
assert response.status_code == 200
65+
66+
5967
class TestChartView:
6068
def test_chart(self, client):
6169
response = client.get(

0 commit comments

Comments
 (0)