Пример #1
0
    def test_happy(self) -> None:
        """Tests the happy path."""
        ctx = test_context.make_test_context()
        ctx.set_time(test_context.make_test_time())
        routes: List[test_context.URLRoute] = [
            test_context.URLRoute(
                url="https://overpass-api.de/api/status",
                data_path="",
                result_path="tests/network/overpass-status-happy.txt"),
            test_context.URLRoute(
                url="https://overpass-api.de/api/interpreter",
                data_path="",
                result_path="tests/network/overpass-stats.csv"),
        ]
        network = test_context.TestNetwork(routes)
        ctx.set_network(network)

        # Create a CSV that is definitely old enough to be removed.
        old_path = ctx.get_abspath("workdir/stats/old.csv")
        create_old_file(old_path)

        today = time.strftime("%Y-%m-%d")
        path = ctx.get_abspath("workdir/stats/%s.csv" % today)
        cron.update_stats(ctx, overpass=True)
        actual = util.get_content(path)
        self.assertEqual(actual,
                         util.get_content("tests/network/overpass-stats.csv"))

        # Make sure that the old CSV is removed.
        self.assertFalse(os.path.exists(old_path))

        with open(ctx.get_abspath("workdir/stats/ref.count"), "r") as stream:
            num_ref = int(stream.read().strip())
        self.assertEqual(num_ref, 300)
Пример #2
0
    def test_stats(self) -> None:
        """Tests the stats path."""
        ctx = test_context.make_test_context()
        routes: List[test_context.URLRoute] = [
            test_context.URLRoute(
                url="https://overpass-api.de/api/status",
                data_path="",
                result_path="tests/network/overpass-status-happy.txt"),
            test_context.URLRoute(
                url="https://overpass-api.de/api/interpreter",
                data_path="",
                result_path="tests/network/overpass-stats.csv"),
        ]
        network = test_context.TestNetwork(routes)
        ctx.set_network(network)
        file_system = test_context.TestFileSystem()
        stats_value = io.BytesIO()
        stats_value.__setattr__("close", lambda: None)
        files = {
            ctx.get_abspath("workdir/stats/stats.json"): stats_value,
        }
        file_system.set_files(files)
        ctx.set_file_system(file_system)

        relations = areas.Relations(ctx)
        cron.our_main(ctx,
                      relations,
                      mode="stats",
                      update=False,
                      overpass=True)

        self.assertTrue(stats_value.tell())
Пример #3
0
 def test_happy(self) -> None:
     """Tests the happy path."""
     ctx = test_context.make_test_context()
     routes: List[test_context.URLRoute] = [
         test_context.URLRoute(
             url="https://overpass-api.de/api/status",
             data_path="",
             result_path="tests/network/overpass-status-happy.txt"),
         test_context.URLRoute(
             url="https://overpass-api.de/api/interpreter",
             data_path="",
             result_path="tests/network/overpass-streets-gazdagret.csv"),
     ]
     network = test_context.TestNetwork(routes)
     ctx.set_network(network)
     relations = areas.Relations(ctx)
     for relation_name in relations.get_active_names():
         if relation_name != "gazdagret":
             relations.get_relation(relation_name).get_config().set_active(
                 False)
     expected = util.get_content(relations.get_workdir(),
                                 "streets-gazdagret.csv")
     path = os.path.join(relations.get_workdir(), "streets-gazdagret.csv")
     os.unlink(path)
     cron.update_osm_streets(ctx, relations, update=True)
     mtime = os.path.getmtime(path)
     cron.update_osm_streets(ctx, relations, update=False)
     self.assertEqual(os.path.getmtime(path), mtime)
     actual = util.get_content(relations.get_workdir(),
                               "streets-gazdagret.csv")
     self.assertEqual(actual, expected)
Пример #4
0
 def test_http_error(self) -> None:
     """Tests the case when we keep getting HTTP errors."""
     ctx = test_context.make_test_context()
     routes: List[test_context.URLRoute] = [
         test_context.URLRoute(
             url="https://overpass-api.de/api/status",
             data_path="",
             result_path="tests/network/overpass-status-happy.txt"),
         test_context.URLRoute(
             url="https://overpass-api.de/api/interpreter",
             data_path="",
             result_path=""),
     ]
     network = test_context.TestNetwork(routes)
     ctx.set_network(network)
     relations = areas.Relations(ctx)
     for relation_name in relations.get_active_names():
         if relation_name != "gazdagret":
             relations.get_relation(relation_name).get_config().set_active(
                 False)
     expected = util.get_content(relations.get_workdir(),
                                 "streets-gazdagret.csv")
     cron.update_osm_streets(ctx, relations, update=True)
     # Make sure that in case we keep getting errors we give up at some stage and
     # leave the last state unchanged.
     actual = util.get_content(relations.get_workdir(),
                               "streets-gazdagret.csv")
     self.assertEqual(actual, expected)
Пример #5
0
    def test_need_sleep(self) -> None:
        """Tests the case when sleep is needed."""
        ctx = test_context.make_test_context()
        routes: List[test_context.URLRoute] = [
            test_context.URLRoute(
                url="https://overpass-api.de/api/status",
                data_path="",
                result_path="tests/network/overpass-status-wait.txt"),
            test_context.URLRoute(
                url="https://overpass-api.de/api/status",
                data_path="",
                result_path="tests/network/overpass-status-happy.txt")
        ]
        network = test_context.TestNetwork(routes)
        ctx.set_network(network)
        ctx.set_time(test_context.make_test_time())

        cron.overpass_sleep(ctx)

        test_time = cast(test_context.TestTime, ctx.get_time())
        self.assertEqual(test_time.get_sleep(), 12)
Пример #6
0
    def test_no_overpass(self) -> None:
        """Tests the case when we don't call overpass."""
        ctx = test_context.make_test_context()
        ctx.set_time(test_context.make_test_time())
        routes: List[test_context.URLRoute] = [
            test_context.URLRoute(
                url="https://overpass-api.de/api/status",
                data_path="",
                result_path="tests/network/overpass-status-wait.txt"),
            test_context.URLRoute(
                url="https://overpass-api.de/api/status",
                data_path="",
                result_path="tests/network/overpass-status-happy.txt")
        ]
        network = test_context.TestNetwork(routes)
        ctx.set_network(network)

        cron.update_stats(ctx, overpass=False)

        test_time = cast(test_context.TestTime, ctx.get_time())
        self.assertEqual(test_time.get_sleep(), 0)
Пример #7
0
 def test_update_result_error_well_formed(self) -> None:
     """Tests if the update-result output on error is well-formed."""
     routes: List[test_context.URLRoute] = [
         test_context.URLRoute(url="https://overpass-api.de/api/interpreter",
                               data_path="",
                               result_path=""),
     ]
     network = test_context.TestNetwork(routes)
     self.ctx.set_network(network)
     root = self.get_dom_for_path("/street-housenumbers/gazdagret/update-result")
     results = root.findall("body/div[@id='overpass-error']")
     self.assertTrue(results)
Пример #8
0
 def test_update_result_well_formed(self) -> None:
     """Tests if the update-result output is well-formed."""
     routes: List[test_context.URLRoute] = [
         test_context.URLRoute(url="https://overpass-api.de/api/interpreter",
                               data_path="",
                               result_path="tests/network/overpass-housenumbers-gazdagret.csv"),
     ]
     network = test_context.TestNetwork(routes)
     self.ctx.set_network(network)
     root = self.get_dom_for_path("/street-housenumbers/gazdagret/update-result")
     results = root.findall("body")
     self.assertEqual(len(results), 1)
Пример #9
0
 def test_wait_negative(self) -> None:
     """Tests the wait for negative amount path."""
     ctx = test_context.make_test_context()
     routes: List[test_context.URLRoute] = [
         test_context.URLRoute(
             url="https://overpass-api.de/api/status",
             data_path="",
             result_path="tests/network/overpass-status-wait-negative.txt")
     ]
     network = test_context.TestNetwork(routes)
     ctx.set_network(network)
     self.assertEqual(overpass_query.overpass_query_need_sleep(ctx), 1)
Пример #10
0
 def test_update_result_json_error(self) -> None:
     """Tests if the update-result json output on error is well-formed."""
     ctx = test_context.make_test_context()
     routes: List[test_context.URLRoute] = [
         test_context.URLRoute(
             url="https://overpass-api.de/api/interpreter",
             data_path="",
             result_path="")
     ]
     network = test_context.TestNetwork(routes)
     ctx.set_network(network)
     root = self.get_json_for_path(ctx,
                                   "/streets/gazdagret/update-result.json")
     self.assertIn("error", root)
Пример #11
0
 def test_update_result_json(self) -> None:
     """Tests if the update-result output is well-formed."""
     ctx = test_context.make_test_context()
     routes: List[test_context.URLRoute] = [
         test_context.URLRoute(
             url="https://overpass-api.de/api/interpreter",
             data_path="",
             result_path="tests/network/overpass-housenumbers-gazdagret.csv"
         )
     ]
     network = test_context.TestNetwork(routes)
     ctx.set_network(network)
     root = self.get_json_for_path(
         ctx, "/street-housenumbers/gazdagret/update-result.json")
     self.assertEqual(root["error"], "")
Пример #12
0
 def test_update_result_missing_streets_well_formed(self) -> None:
     """
     Tests if the update-result output is well-formed for should_check_missing_streets() ==
     "only".
     """
     routes: List[test_context.URLRoute] = [
         test_context.URLRoute(url="https://overpass-api.de/api/interpreter",
                               data_path="",
                               result_path="tests/network/overpass-streets-ujbuda.csv"),
     ]
     network = test_context.TestNetwork(routes)
     self.ctx.set_network(network)
     root = self.get_dom_for_path("/streets/ujbuda/update-result")
     results = root.findall("body")
     self.assertEqual(len(results), 1)
Пример #13
0
 def test_happy(self) -> None:
     """Tests the happy path."""
     ctx = test_context.make_test_context()
     routes: List[test_context.URLRoute] = [
         test_context.URLRoute(
             url="https://overpass-api.de/api/interpreter",
             data_path="tests/network/overpass-happy.expected-data",
             result_path="tests/network/overpass-happy.csv")
     ]
     network = test_context.TestNetwork(routes)
     ctx.set_network(network)
     with open("tests/network/overpass-happy.expected-data") as stream:
         query = stream.read()
         buf, err = overpass_query.overpass_query(ctx, query)
         self.assertEqual(buf[:3], "@id")
         self.assertEqual(err, str())
Пример #14
0
 def test_http_error(self) -> None:
     """Tests the case when we keep getting HTTP errors."""
     ctx = test_context.make_test_context()
     ctx.set_time(test_context.make_test_time())
     routes: List[test_context.URLRoute] = [
         test_context.URLRoute(
             url="https://overpass-api.de/api/status",
             data_path="",
             result_path="tests/network/overpass-status-happy.txt"),
     ]
     network = test_context.TestNetwork(routes)
     ctx.set_network(network)
     old_mtime = ctx.get_file_system().getmtime(
         ctx.get_abspath("workdir/stats/stats.json"))
     cron.update_stats(ctx, overpass=True)
     new_mtime = ctx.get_file_system().getmtime(
         ctx.get_abspath("workdir/stats/stats.json"))
     self.assertGreater(new_mtime, old_mtime)
Пример #15
0
    def test_happy(self) -> None:
        """Tests the happy path."""
        ctx = test_context.make_test_context()
        routes: List[test_context.URLRoute] = [
            # For update_osm_streets().
            test_context.URLRoute(
                url="https://overpass-api.de/api/status",
                data_path="",
                result_path="tests/network/overpass-status-happy.txt"),
            test_context.URLRoute(
                url="https://overpass-api.de/api/interpreter",
                data_path="",
                result_path="tests/network/overpass-streets-gazdagret.csv"),
            # For update_osm_housenumbers().
            test_context.URLRoute(
                url="https://overpass-api.de/api/interpreter",
                data_path="",
                result_path="tests/network/overpass-housenumbers-gazdagret.csv"
            ),
        ]
        network = test_context.TestNetwork(routes)
        ctx.set_network(network)
        file_system = test_context.TestFileSystem()
        yamls_cache = {
            "relations.yaml": {
                "gazdagret": {
                    "osmrelation": 2713748,
                    "refcounty": "01",
                    "refsettlement": "011",
                },
            },
            "refcounty-names.yaml": {},
            "refsettlement-names.yaml": {},
        }
        yamls_cache_value = io.BytesIO()
        yamls_cache_value.__setattr__("close", lambda: None)
        yamls_cache_value.write(util.to_bytes(json.dumps(yamls_cache)))
        yamls_cache_value.seek(0)
        osm_streets_value = io.BytesIO()
        osm_streets_value.__setattr__("close", lambda: None)
        osm_housenumbers_value = io.BytesIO()
        osm_housenumbers_value.__setattr__("close", lambda: None)
        ref_streets_value = io.BytesIO()
        ref_streets_value.__setattr__("close", lambda: None)
        ref_housenumbers_value = io.BytesIO()
        ref_housenumbers_value.__setattr__("close", lambda: None)
        missing_streets_value = io.BytesIO()
        missing_streets_value.__setattr__("close", lambda: None)
        missing_housenumbers_value = io.BytesIO()
        missing_housenumbers_value.__setattr__("close", lambda: None)
        additional_streets_value = io.BytesIO()
        additional_streets_value.__setattr__("close", lambda: None)
        files = {
            ctx.get_abspath("data/yamls.cache"):
            yamls_cache_value,
            ctx.get_abspath("workdir/streets-gazdagret.csv"):
            osm_streets_value,
            ctx.get_abspath("workdir/street-housenumbers-gazdagret.csv"):
            osm_housenumbers_value,
            ctx.get_abspath("workdir/streets-reference-gazdagret.lst"):
            ref_streets_value,
            ctx.get_abspath("workdir/street-housenumbers-reference-gazdagret.lst"):
            ref_housenumbers_value,
            ctx.get_abspath("workdir/gazdagret-streets.percent"):
            missing_streets_value,
            ctx.get_abspath("workdir/gazdagret.percent"):
            missing_housenumbers_value,
            ctx.get_abspath("workdir/gazdagret-additional-streets.count"):
            additional_streets_value,
        }
        file_system.set_files(files)
        ctx.set_file_system(file_system)
        relations = areas.Relations(ctx)

        cron.our_main(ctx,
                      relations,
                      mode="relations",
                      update=True,
                      overpass=True)

        # update_osm_streets() is called.
        self.assertTrue(osm_streets_value.tell())
        # update_osm_housenumbers() is called.
        self.assertTrue(osm_housenumbers_value.tell())
        # update_ref_streets() is called.
        self.assertTrue(ref_streets_value.tell())
        # update_ref_housenumbers() is called.
        self.assertTrue(ref_housenumbers_value.tell())
        # update_missing_streets() is called.
        self.assertTrue(missing_streets_value.tell())
        # update_missing_housenumbers() is called.
        self.assertTrue(missing_housenumbers_value.tell())
        # update_additional_streets() is called.
        self.assertTrue(additional_streets_value.tell())