From 8479ee298c36b05f04be81d02e715b92d73c68f3 Mon Sep 17 00:00:00 2001 From: Jun-te Kim Date: Thu, 29 Jan 2026 11:56:11 +0000 Subject: [PATCH] run all the test --- backend/address2UPRN/main.py | 20 ++- backend/address2UPRN/tests/test_csv.py | 40 ++++++ backend/address2UPRN/tests/test_data.csv | 167 +++++++++++++++++++++++ conftest.py | 11 +- 4 files changed, 235 insertions(+), 3 deletions(-) create mode 100644 backend/address2UPRN/tests/test_csv.py create mode 100644 backend/address2UPRN/tests/test_data.csv diff --git a/backend/address2UPRN/main.py b/backend/address2UPRN/main.py index 3b02151a..a4282bc9 100644 --- a/backend/address2UPRN/main.py +++ b/backend/address2UPRN/main.py @@ -4,12 +4,14 @@ from urllib.parse import urlencode import pandas as pd from difflib import SequenceMatcher from tqdm import tqdm +from utils.logger import setup_logger + +logger = setup_logger() import re EPC_AUTH_TOKEN = os.getenv( "EPC_AUTH_TOKEN", - "a2Nvbm5rb3dsZXNzYXJAZ21haWwuY29tOjY5MGJiMWM0NmIyOGI5ZDUxYzAxMzQzYzNiZGNlZGJjZDNmODQwMzA=", ) import re @@ -259,6 +261,11 @@ def get_uprn_candidates( def get_uprn(user_inputed_address: str, postcode: str): + """ + Return uprn (str) + Return False if failed to find a sensible matching epc + Return Nons when epc found but no UPRN + """ df = get_epc_data_with_postcode(postcode=postcode) if df.empty: @@ -282,8 +289,17 @@ def get_uprn(user_inputed_address: str, postcode: str): if not df_has_single_uprn(top_rank_df, uprn=top_rank_df.iloc[0]["uprn"]): return False + address = top_rank_df["address"].values[0] + lexiscore = float(top_rank_df["lexiscore"].values[0]) + + logger.info(f"Address found to be: {address}, with lexiscore {lexiscore}") # Safe to return the agreed UPRN - return top_rank_df.iloc[0]["uprn"] + found_uprn = top_rank_df.iloc[0]["uprn"] + + if found_uprn == "": + return None + + return found_uprn def resolve_uprns_for_postcode_group( diff --git a/backend/address2UPRN/tests/test_csv.py b/backend/address2UPRN/tests/test_csv.py new file mode 100644 index 00000000..70e7a9f9 --- /dev/null +++ b/backend/address2UPRN/tests/test_csv.py @@ -0,0 +1,40 @@ +# tests/test_address_to_uprn_csv.py + +import csv +import pytest +from pathlib import Path +from backend.address2UPRN.main import get_uprn + +FIXTURE_PATH = Path(__file__).parent / "test_data.csv" + + +def load_test_cases(): + with open(FIXTURE_PATH, newline="", encoding="utf-8") as f: + reader = csv.DictReader(f) + return [ + pytest.param( + row["User Input"], + row["Postcode"], + row["Manual UPRN Code"], + id=f'{row["User Input"]} [{row["Postcode"]}]', + ) + for row in reader + ] + + +@pytest.mark.parametrize( + "user_input,postcode,expected_uprn", + load_test_cases(), +) +def test_uprn_resolution_matches_manual( + user_input: str, + postcode: str, + expected_uprn: str, +): + from utils.logger import setup_logger + + uprn = get_uprn(user_input, postcode) + if uprn: + assert uprn == expected_uprn + else: + assert str(uprn) == expected_uprn diff --git a/backend/address2UPRN/tests/test_data.csv b/backend/address2UPRN/tests/test_data.csv new file mode 100644 index 00000000..8efb229a --- /dev/null +++ b/backend/address2UPRN/tests/test_data.csv @@ -0,0 +1,167 @@ +User Input,Postcode,Manual UPRN Code +47 The Fairway,OX16 0RR,100120771697 +11 REGENT COURT,SL1 3LG,100081041562 +3/137a Windmill Road,TW8 9NH,100021516998 +Flat 33,SW18 4BE,100023328943 +FLAT 1 Brendon Grove,N2 8JE,200013412 +Flat 15,KT8 2NE,100062123759 +FLAT 5 Stonehill Road,W4 3AH,100021589829 +10 Douglas Court,SL7 1UQ,100081278099 +1 Windmill Road,HP17 8JA,766034606 +31 Denewood,HP13 7LH,100081095964 +"10, Greenways Drive",TW4 5DD,10091597009 +Flat 10,W4 3AH,"100021589834" +Flat 11,TW4 5DD,10091597010 +Flat 11,W4 3AH,100021589835 +"12, Greenways Drive",TW4 5DD,10091597011 +"Flat 12, Forbes House",W4 3AH,100021589836 +FLAT 1 Goodstone Court,HA1 4FL,10070269053 +Flat 13,TW4 5DD,10091597012 +Flat 13,W4 3AH,100021589837 +Flat 14,TW4 5DD,10091597013 +Flat 14,W4 3AH,100021589838 +Flat 15,TW4 5DD,10091597014 +Flat 15,W4 3AH,100021589839 +Flat 16,TW4 5DD,"10091597015" +Flat 16,W4 3AH,100021589840 +Flat 17,TW4 5DD,10091597016 +Flat 17,W4 3AH,100021589841 +Flat 18,TW4 5DD,10091597017 +Flat 19,W4 3AH,100021589843 +Flat 20,W4 3AH,100021589844 +Flat 21,W4 3AH,100021589845 +Flat 22,W4 3AH,100021589846 +FLAT 2 Goodstone Court,HA1 4FL,10070269054 +Flat 23,W4 3AH,100021589847 +Flat 24,W4 3AH,100021589848 +"30c, Bosanquet Close",UB8 3PE,100021475316 +"30e, Bosanquet Close",UB8 3PE,100021475318 +FLAT 3 Goodstone Court,HA1 4FL,10070269055 +FLAT 4 Goodstone Court,HA1 4FL,10070269056 +FLAT 5 Goodstone Court,HA1 4FL,10070269057 +FLAT 6 Goodstone Court,HA1 4FL,10070269058 +FLAT 7 Goodstone Court,HA1 4FL,10070269059 +FLAT 8 Goodstone Court,HA1 4FL,10070269060 +FLAT 9 Goodstone Court,HA1 4FL,10070269061 +FLAT 10 Goodstone Court,HA1 4FL,10070269062 +FLAT 11 Goodstone Court,HA1 4FL,10070269063 +FLAT 12 Goodstone Court,HA1 4FL,10070269064 +FLAT 13 Goodstone Court,HA1 4FL,10070269065 +FLAT 14 Goodstone Court,HA1 4FL,10070269066 +FLAT 15 Goodstone Court,HA1 4FL,10070269067 +FLAT 16 Goodstone Court,HA1 4FL,10070269068 +FLAT 17 Goodstone Court,HA1 4FL,10070269069 +FLAT 18 Goodstone Court,HA1 4FL,10070269070 +FLAT 19 Goodstone Court,HA1 4FL,10070269071 +FLAT 20 Goodstone Court,HA1 4FL,10070269072 +FLAT 21 Goodstone Court,HA1 4FL,10070269073 +FLAT 22 Goodstone Court,HA1 4FL,10070269074 +FLAT 23 Goodstone Court,HA1 4FL,10070269075 +FLAT 24 Goodstone Court,HA1 4FL,10070269076 +FLAT 25 Goodstone Court,HA1 4FL,10070269077 +FLAT 26 Goodstone Court,HA1 4FL,10070269078 +FLAT 27 Goodstone Court,HA1 4FL,10070269079 +FLAT 28 Goodstone Court,HA1 4FL,10070269080 +FLAT 29 Goodstone Court,HA1 4FL,10070269081 +FLAT 30 Goodstone Court,HA1 4FL,10070269082 +FLAT 31 Goodstone Court,HA1 4FL,10070269083 +FLAT 32 Goodstone Court,HA1 4FL,10070269084 +FLAT 33 Goodstone Court,HA1 4FL,10070269085 +FLAT 34 Goodstone Court,HA1 4FL,10070269086 +FLAT 35 Goodstone Court,HA1 4FL,10070269087 +FLAT 36 Goodstone Court,HA1 4FL,10070269088 +FLAT 37 Goodstone Court,HA1 4FL,10070269089 +FLAT 38 Goodstone Court,HA1 4FL,10070269090 +FLAT 39 Goodstone Court,HA1 4FL,10070269091 +FLAT 40 Goodstone Court,HA1 4FL,10070269092 +FLAT 41 Goodstone Court,HA1 4FL,10070269093 +FLAT 42 Goodstone Court,HA1 4FL,10070269094 +FLAT 43 Goodstone Court,HA1 4FL,10070269095 +"13 Stubwick Court, Old Saw Mill Place",HP6 6FF,10013778260 +"14 Stubwick Court, Old Saw Mill Place",HP6 6FF,10013778259 +"15 Stubwick Court, Old Saw Mill Place",HP6 6FF,10013778258 +"16 Stubwick Court, Old Saw Mill Place",HP6 6FF,10013778263 +"17 Stubwick Court, Old Saw Mill Place",HP6 6FF,10013778262 +"18 Stubwick Court, Old Saw Mill Place",HP6 6FF,10013778261 +"19 Stubwick Court, Old Saw Mill Place",HP6 6FF,10013778266 +"20 Stubwick Court, Old Saw Mill Place",HP6 6FF,10013778265 +"21 Stubwick Court, Old Saw Mill Place",HP6 6FF,10013778264 +90a Murray Road,W5 4DA,12135293 +"Flat 1, 6 Wolverton Gardens",W5 3LJ,"12119972" +"1, Monsted House",UB1 1FG,12189944 +"10, Monsted House",UB1 1FG,12189953 +"20, Monsted House",UB1 1FG,12189963 +"2, Monsted House",UB1 1FG,12189945 +"3, Monsted House",UB1 1FG,12189946 +"4, Monsted House",UB1 1FG,12189947 +"5, Monsted House",UB1 1FG,12189948 +"6, Monsted House",UB1 1FG,12189949 +"7, Monsted House",UB1 1FG,12189950 +"8, Monsted House",UB1 1FG,12189951 +"9, Monsted House",UB1 1FG,12189952 +"1 Cullis House, 1, Accolade Avenue",UB1 1FH,12189904 +"2 Cullis House, 1, Accolade Avenue",UB1 1FH,12189905 +"3 Cullis House, 1, Accolade Avenue",UB1 1FH,12189906 +"4 Cullis House, 1, Accolade Avenue",UB1 1FH,12189907 +"5 Cullis House, 1, Accolade Avenue",UB1 1FH,12189908 +"6 Cullis House, 1, Accolade Avenue",UB1 1FH,12189909 +1 Genteel House Samara Drive,UB1 1FJ,12189835 +2 Genteel House Samara Drive,UB1 1FJ,12189836 +3 Genteel House Samara Drive,UB1 1FJ,12189837 +4 Genteel House Samara Drive,UB1 1FJ,12189838 +5 Genteel House Samara Drive,UB1 1FJ,12189839 +6 Genteel House Samara Drive,UB1 1FJ,12189840 +7 Genteel House Samara Drive,UB1 1FJ,12189841 +8 Genteel House Samara Drive,UB1 1FJ,12189842 +9 Genteel House Samara Drive,UB1 1FJ,12189843 +10 Genteel House Samara Drive,UB1 1FJ,12189844 +1 ASH TREE HOUSE,SE5 0TE,10009803979 +3 ASH TREE HOUSE,SE5 0TE,10009803981 +5 ASH TREE HOUSE,SE5 0TE,10009803983 +8 ASH TREE HOUSE,SE5 0TE,10009803986 +12 ASH TREE HOUSE,SE5 0TE,10009803990 +FLAT 1 599 HARROW ROAD,W10 4RA,217113930 +FLAT 2 599 HARROW ROAD,W10 4RA,217113931 +FLAT 3 599 HARROW ROAD,W10 4RA,None +FLAT 4 599 HARROW ROAD,W10 4RA,False +FLAT 5 599 HARROW ROAD,W10 4RA,217113934 +FLAT 6 599 HARROW ROAD,W10 4RA,False +FLAT 7 599 HARROW ROAD,W10 4RA,False +FLAT 8 599 HARROW ROAD,W10 4RA,None +"Flat 1, Ohio Building",SE13 7RX,10023226256 +"Flat 2, Ohio Building",SE13 7RX,10023226257 +"Apartment 1 Block B, 105, Benwell Road",N7 7BW,10012792307 +"Apartment 2 Block B, 105, Benwell Road",N7 7BW,10012792308 +"Apartment 3 Block B, 105, Benwell Road",N7 7BW,10012792309 +"Apartment 4 Block B, 105, Benwell Road",N7 7BW,10012792310 +"Apartment 5 Block B, 105, Benwell Road",N7 7BW,10012792311 +"Apartment 6 Block B, 105, Benwell Road",N7 7BW,10012792312 +"Apartment 7 Block B, 105, Benwell Road",N7 7BW,10012792313 +"Apartment 8 Block B, 105, Benwell Road",N7 7BW,10012792314 +"Apartment 9 Block B, 105, Benwell Road",N7 7BW,10012792315 +"Apartment 10 Block B, 105, Benwell Road",N7 7BW,10012792316 +"Apartment 11 Block B, 105, Benwell Road",N7 7BW,10012792317 +"Apartment 12 Block B, 105, Benwell Road",N7 7BW,10012792318 +"Apartment 13 Block B, 105, Benwell Road",N7 7BW,10012792319 +"Apartment 1 Block D, 32, Hornsey Road",N7 7AT,10012792366 +"Apartment 2 Block D, 32, Hornsey Road",N7 7AT,10012792367 +"Apartment 3 Block D, 32, Hornsey Road",N7 7AT,10012792368 +"Apartment 4 Block D, 32, Hornsey Road",N7 7AT,10012792369 +"Apartment 5 Block D, 32, Hornsey Road",N7 7AT,10012792370 +"Apartment 6 Block D, 32, Hornsey Road",N7 7AT,"10012792371" +"Apartment 7 Block D, 32, Hornsey Road",N7 7AT,10012792372 +"Apartment 8 Block D, 32, Hornsey Road",N7 7AT,10012792373 +"Apartment 9 Block D, 32, Hornsey Road",N7 7AT,10012792374 +"Apartment 10 Block D, 32, Hornsey Road",N7 7AT,10012792375 +"Apartment 11 Block D, 32, Hornsey Road",N7 7AT,10012792376 +"Apartment 12 Block D, 32, Hornsey Road",N7 7AT,10012792377 +"Apartment 13 Block D, 32, Hornsey Road",N7 7AT,10012792378 +"Apartment 14 Block D, 32, Hornsey Road",N7 7AT,10012792379 +"Apartment 15 Block D, 32, Hornsey Road",N7 7AT,10012792380 +"Apartment 16 Block D, 32, Hornsey Road",N7 7AT,"10012792381" +"Apartment 17Block D, 32, Hornsey Road",N7 7AT,10012792382 +"Apartment 18 Block D, 32, Hornsey Road",N7 7AT,10012792383 +24b Honley Road,SE6 2HZ,None +FLAT B 158 LEAHURST ROAD,SE13 5NL,100021976974 +2 COLLEGE HOUSE,CM7 1JS,100091449870 +3 COLLEGE HOUSE,CM7 1JS,100091449871 \ No newline at end of file diff --git a/conftest.py b/conftest.py index be5c54a4..d93f0023 100644 --- a/conftest.py +++ b/conftest.py @@ -1,5 +1,11 @@ import os from backend.app.config import get_settings +import os +from dotenv import load_dotenv +import os + +# Load .env in conftest.py directory for local development +load_dotenv() DEFAULT_ENV = { "API_KEY": "test", @@ -8,7 +14,10 @@ DEFAULT_ENV = { "DATA_BUCKET": "test", "PLAN_TRIGGER_BUCKET": "test", "ENGINE_SQS_URL": "test", - "EPC_AUTH_TOKEN": "a2Nvbm5rb3dsZXNzYXJAZ21haWwuY29tOjY5MGJiMWM0NmIyOGI5ZDUxYzAxMzQzYzNiZGNlZGJjZDNmODQwMzA=", # overridden in GitHub Actions + "EPC_AUTH_TOKEN": os.getenv( + "EPC_AUTH_TOKEN", + "test", + ), # overridden in GitHub Actions "GOOGLE_SOLAR_API_KEY": "test", "DB_HOST": "localhost", "DB_USERNAME": "test",