def test_get_council_split_postcodes(self):
        in_list = [
            {
                "address": "foo",
                "postcode": "AA11AA",
                "council": "AAA",
                "polling_station_id": "01",
                "uprn": "1",
            },
            {
                "address": "bar",
                "postcode": "AA11AA",
                "council": "AAA",
                "polling_station_id": "02",
                "uprn": "2",
            },
            {
                "address": "baz",
                "postcode": "BB11BB",
                "council": "AAA",
                "polling_station_id": "03",
                "uprn": "1",
            },
        ]

        address_list = AddressList(MockLogger())
        for el in in_list:
            address_list.append(el)
        expected = ["AA11AA"]
        self.assertListEqual(expected, address_list.get_council_split_postcodes())
    def test_get_uprn_lookup(self):
        in_list = [
            {
                "polling_station_id": "01",
                "address": "foo 1",
                "postcode": "AA1 2BB",
                "council": "AAA",
                "uprn": "1",
            },
            {
                "polling_station_id": "01",
                "address": "foo 2",
                "postcode": "AA1 2BB",
                "council": "AAA",
                "uprn": "2",
            },
            {
                "polling_station_id": "01",
                "address": "foo 3",
                "postcode": "AA1 2BB",
                "council": "AAA",
                "uprn": "3",
            },
            {
                "polling_station_id": "02",
                "address": "foo 4",
                "postcode": "AA1 2BB",
                "council": "AAA",
                "uprn": "4",
            },
            {
                "polling_station_id": "02",
                "address": "foo 5",
                "postcode": "AA1 2BB",
                "council": "AAA",
                "uprn": "5",
            },
            {
                "polling_station_id": "01",
                "address": "foo 5",
                "postcode": "AA1 2BB",
                "council": "AAA",
                "uprn": "5",
            },
        ]
        expected = {
            "1": {"01"},
            "2": {"01"},
            "3": {"01"},
            "4": {"02"},
            "5": {"02", "01"},
        }
        address_list = AddressList(MockLogger())
        for el in in_list:
            address_list.append(el)

        self.assertEqual(expected, address_list.get_uprn_lookup())
    def test_add_with_duplicates(self):
        in_list = [
            {
                "address": "foo",
                "postcode": "AA11AA",
                "council": "AAA",
                "polling_station_id": "01",
                "uprn": "1",
            },
            {
                "address": "bar",
                "postcode": "AA11AA",
                "council": "AAA",
                "polling_station_id": "01",
                "uprn": "2",
            },
            {
                "address": "foo",
                "postcode": "AA11AA",
                "council": "AAA",
                "polling_station_id": "01",
                "uprn": "1",
            },
        ]

        expected = [
            {
                "address": "foo",
                "postcode": "AA11AA",
                "council": "AAA",
                "polling_station_id": "01",
                "uprn": "1",
            },
            {
                "address": "bar",
                "postcode": "AA11AA",
                "council": "AAA",
                "polling_station_id": "01",
                "uprn": "2",
            },
            {  # This is correct we deal with duplicates later.
                "address": "foo",
                "postcode": "AA11AA",
                "council": "AAA",
                "polling_station_id": "01",
                "uprn": "1",
            },
        ]

        address_list = AddressList(MockLogger())
        for el in in_list:
            address_list.append(el)

        self.assertEqual(expected, address_list.elements)
    def import_data(self):

        # Optional step for pre import tasks
        try:
            self.pre_import()
        except NotImplementedError:
            pass

        self.stations = StationSet()
        self.addresses = AddressList(self.logger)
        self.import_residential_addresses()
        self.import_polling_stations()
        self.addresses.check_records()
        self.addresses.update_uprn_to_council_model()
        self.stations.save()
    def test_append(self):
        in_list = [
            {
                "address": "foo",
                "postcode": "AA11AA",
                "council": "AAA",
                "polling_station_id": "01",
                "uprn": "1",
            },
            {  # Doesn't need a uprn - this should be added
                "address": "bar",
                "postcode": "AA11AA",
                "council": "AAA",
                "polling_station_id": "01",
                "uprn": "",
            },
            {  # Does need a postcode - this shouldn't
                "address": "baz",
                "postcode": "",
                "council": "AAA",
                "polling_station_id": "01",
                "uprn": "1",
            },
        ]
        expected = [
            {
                "address": "foo",
                "postcode": "AA11AA",
                "council": "AAA",
                "polling_station_id": "01",
                "uprn": "1",
            },
            {
                "address": "bar",
                "postcode": "AA11AA",
                "council": "AAA",
                "polling_station_id": "01",
                "uprn": "",
            },
        ]
        address_list = AddressList(MockLogger())
        for el in in_list:
            address_list.append(el)

        self.assertEqual(expected, address_list.elements)
    def test_remove_records_that_dont_match_addressbase(self):
        in_list = [
            {
                "polling_station_id": "01",
                "address": "foo 1",
                "postcode": "AA1 2BB",
                "council": "AAA",
                "uprn": "1",
            },
            {
                "polling_station_id": "01",
                "address": "foo 2",
                "postcode": "AA1 2BB",
                "council": "AAA",
                "uprn": "2",
            },
        ]
        addressbase_data = {"1": {"postcode": "AA1 2BB"}, "2": {"postcode": "AA1 2CC"}}
        expected = [
            {
                "polling_station_id": "01",
                "address": "foo 1",
                "postcode": "AA1 2BB",
                "council": "AAA",
                "uprn": "1",
            },
        ]

        address_list = AddressList(MockLogger())
        for el in in_list:
            address_list.append(el)

        address_list.remove_records_that_dont_match_addressbase(addressbase_data)
        self.assertEqual(expected, address_list.elements)
    def test_check_split_postcodes_are_split(self):
        """
        AddressBase                      | Council Data
                                         |
        uprn | Address        | Postcode | uprn | Address       | Postcode | Station
        ---------------------------------|------------------------------------------
        123  | 1 Foo Street   | AA11AA   | 123  | 1 Foo Street  | AA11AA   | A1
        124  | 2 Foo Street   | AA11AA   | 124  | 2 Foo Street  | AA11AA   | A1
        125  | 3 Foo Street   | AA11AA   | 125  | 3 Foo Street  | AA22AA   | A2
        ---------------------------------|------------------------------------------
        223  | 1 Bar Street   | BB11BB   | 223  | 1 Bar Street  | BB11BB   | B1
        224  | 2 Bar Street   | BB11BB   | 224  | 2 Bar Street  | BB11BB   | B1
                                         | 225  | 3 Bar Street  | BB11BB   | B2
        ---------------------------------|------------------------------------------
        323  | 1 Baz Street   | CC11CC   | 323  | 1 Baz Street  | CC11CC   | C1
        324  | 2 Baz Street   | CC11CC   | 324  | 2 Baz Street  | CC11CC   | C1
        325  | 3 Baz Street   | CC22CC   | 325  | 3 Baz Street  | CC11CC   | C2

        BB11BB and CC11CC are the ones we won't think are split, but are really.
        Our checks should remove 225 and 325 because there aren't matches for them
        in addressbase. Therefore they're not in the in_list.
        """

        in_list = [
            {
                "address": "1 Foo Street",
                "postcode": "AA11AA",
                "council": "AAA",
                "polling_station_id": "A1",
                "uprn": "123",
            },
            {
                "address": "2 Foo Street",
                "postcode": "AA11AA",
                "council": "AAA",
                "polling_station_id": "A1",
                "uprn": "124",
            },
            {
                "address": "3 Foo Street",
                "postcode": "AA22AA",
                "council": "AAA",
                "polling_station_id": "A2",
                "uprn": "125",
            },
            {
                "address": "1 Bar Street",
                "postcode": "BB11BB",
                "council": "AAA",
                "polling_station_id": "B1",
                "uprn": "223",
            },
            {
                "address": "2 Bar Street",
                "postcode": "BB11BB",
                "council": "AAA",
                "polling_station_id": "B1",
                "uprn": "224",
            },
            {
                "address": "1 Baz Street",
                "postcode": "CC11CC",
                "council": "AAA",
                "polling_station_id": "C1",
                "uprn": "323",
            },
            {
                "address": "2 Baz Street",
                "postcode": "CC11CC",
                "council": "AAA",
                "polling_station_id": "C1",
                "uprn": "324",
            },
        ]

        addressbase = [
            # AA11A
            {"uprn": "123", "address": "1 Foo Street", "postcode": "AA11AA"},
            {"uprn": "124", "address": "2 Foo Street", "postcode": "AA11AA"},
            {"uprn": "125", "address": "3 Foo Street", "postcode": "AA11AA"},
            # BB11BB
            {"uprn": "223", "address": "1 Bar Street ", "postcode": "BB11BB"},
            {"uprn": "224", "address": "2 Bar Street ", "postcode": "BB11BB"},
            # CC11CC
            {"uprn": "323", "address": "1 Baz Street", "postcode": "CC11CC"},
            {"uprn": "324", "address": "2 Baz Street", "postcode": "CC11CC"},
            # CC22CC
            {"uprn": "325", "address": "3 Baz Street", "postcode": "CC22CC"},
        ]
        for address in addressbase:
            AddressFactory(**address)
        address_list = AddressList(MockLogger())
        address_list.logger.clear_logs()
        for el in in_list:
            address_list.append(el)

        split_postcodes = ["BB11BB", "CC11CC"]
        address_list.check_split_postcodes_are_split(split_postcodes)
        self.assertListEqual(
            address_list.logger.logs,
            [
                'These postcodes are split in council data: "BB11BB", "CC11CC", but won\'t be in the db once imported.'
            ],
        )
    def test_remove_duplicate_uprns(self):
        in_list = [
            {
                "polling_station_id": "01",
                "address": "foo 1",
                "postcode": "AA1 2BB",
                "council": "AAA",
                "uprn": "1",
            },
            {
                "polling_station_id": "01",
                "address": "foo 2",
                "postcode": "AA1 2BB",
                "council": "AAA",
                "uprn": "2",
            },
            {
                "polling_station_id": "01",
                "address": "foo 3",
                "postcode": "AA1 2BB",
                "council": "AAA",
                "uprn": "3",
            },
            {
                "polling_station_id": "02",
                "address": "foo 4",
                "postcode": "AA1 2BB",
                "council": "AAA",
                "uprn": "4",
            },
            {
                "polling_station_id": "02",
                "address": "foo 5",
                "postcode": "AA1 2BB",
                "council": "AAA",
                "uprn": "5",
            },
            {
                "polling_station_id": "01",
                "address": "foo 5",
                "postcode": "AA1 2BB",
                "council": "AAA",
                "uprn": "5",
            },
        ]

        expected = [
            {
                "polling_station_id": "01",
                "address": "foo 1",
                "postcode": "AA1 2BB",
                "council": "AAA",
                "uprn": "1",
            },
            {
                "polling_station_id": "01",
                "address": "foo 2",
                "postcode": "AA1 2BB",
                "council": "AAA",
                "uprn": "2",
            },
            {
                "polling_station_id": "01",
                "address": "foo 3",
                "postcode": "AA1 2BB",
                "council": "AAA",
                "uprn": "3",
            },
            {
                "polling_station_id": "02",
                "address": "foo 4",
                "postcode": "AA1 2BB",
                "council": "AAA",
                "uprn": "4",
            },
        ]
        address_list = AddressList(MockLogger())
        for el in in_list:
            address_list.append(el)

        address_list.remove_duplicate_uprns()
        self.assertEqual(expected, address_list.elements)