Exemplo n.º 1
0
    def test_zones_api_no_geom(self):
        zone = GeoZoneFactory(geom=None)

        url = url_for('api.zones', ids=[zone.id])
        response = self.get(url)
        self.assert200(response)

        self.assertEqual(len(response.json['features']), 1)

        feature = response.json['features'][0]
        self.assertEqual(feature['type'], 'Feature')
        assert_json_equal(feature['geometry'], {
            'type': 'MultiPolygon',
            'coordinates': [],
        })
        self.assertEqual(feature['id'], zone.id)

        properties = feature['properties']
        self.assertEqual(properties['name'], zone.name)
        self.assertEqual(properties['code'], zone.code)
        self.assertEqual(properties['level'], zone.level)
        self.assertEqual(properties['parents'], zone.parents)
        self.assertEqual(properties['population'], zone.population)
        self.assertEqual(properties['area'], zone.area)
        self.assertEqual(properties['keys'], zone.keys)
        self.assertEqual(properties['logo'], zone.logo_url(external=True))
Exemplo n.º 2
0
 def test_suggest_towns(self):
     arles_sur_tech = GeoZoneFactory(
         id='fr:commune:66009@1942-01-01', level='fr:commune',
         parents=[self.bdr.id], name='Arles-sur-Tech', code='66009',
         keys={'postal': '66150'}, population=2687, area=0,
         validity={'start': '1942-01-01', 'end': '9999-12-31'})
     response = self.get(
         url_for('api.suggest_territory'), qs={'q': 'arles'})
     self.assert200(response)
     results = response.json
     self.assertEqual(len(results), 2)
     # Arles must be first given the population.
     self.assertEqual(results[0]['id'], self.arles.id)
     self.assertEqual(results[1]['id'], arles_sur_tech.id)
Exemplo n.º 3
0
    def test_zones_api_one(self):
        zone = GeoZoneFactory()

        url = url_for('api.zones', ids=[zone.id])
        response = self.get(url)
        self.assert200(response)

        self.assertEqual(len(response.json['features']), 1)

        feature = response.json['features'][0]
        self.assertEqual(feature['type'], 'Feature')
        assert_json_equal(feature['geometry'], zone.geom)
        self.assertEqual(feature['id'], zone.id)

        properties = feature['properties']
        self.assertEqual(properties['name'], zone.name)
        self.assertEqual(properties['code'], zone.code)
        self.assertEqual(properties['level'], zone.level)
        self.assertEqual(properties['parents'], zone.parents)
        self.assertEqual(properties['population'], zone.population)
        self.assertEqual(properties['area'], zone.area)
        self.assertEqual(properties['keys'], zone.keys)
        self.assertEqual(properties['logo'], zone.logo_url(external=True))
Exemplo n.º 4
0
    def test_suggest_zones_no_match(self):
        '''It should not provide zones suggestions if no match'''
        for i in range(3):
            GeoZoneFactory(name=5 * '{0}'.format(i),
                           code=3 * '{0}'.format(i),
                           is_current=True)

        response = self.get(url_for('api.suggest_zones'),
                            qs={
                                'q': 'xxxxxx',
                                'size': '5'
                            })
        self.assert200(response)
        self.assertEqual(len(response.json), 0)
Exemplo n.º 5
0
 def test_suggest_town_and_county(self):
     bouchet = GeoZoneFactory(
         id='fr:commune:26054@1942-01-01', level='fr:commune',
         parents=[self.bdr.id], name='Bouchet', code='26054',
         keys={'postal': '26790'}, population=1305, area=0,
         validity={'start': '1942-01-01', 'end': '9999-12-31'})
     response = self.get(
         url_for('api.suggest_territory'), qs={'q': 'bouche'})
     self.assert200(response)
     results = response.json
     self.assertEqual(len(results), 2)
     # BDR must be first given the population.
     self.assertEqual(results[0]['id'], self.bdr.id)
     self.assertEqual(results[1]['id'], bouchet.id)
Exemplo n.º 6
0
 def test_with_gouvfr_region_territory_datasets(self):
     paca = GeoZoneFactory(id='fr/region/93',
                           level='fr/region',
                           name='Provence Alpes Côtes dAzur')
     response = self.client.get(
         url_for('territories.territory', territory=paca))
     self.assert200(response)
     data = response.data.decode('utf-8')
     self.assertIn(paca.name, data)
     base_datasets = self.get_context_variable('base_datasets')
     self.assertEqual(len(base_datasets), 8)
     for dataset in base_datasets:
         self.assertIn(
             '<div data-udata-territory-id="{dataset.slug}"'.format(
                 dataset=dataset), data)
Exemplo n.º 7
0
 def test_with_gouvfr_county_territory_datasets(self):
     bdr = GeoZoneFactory(id='fr/county/13',
                          level='fr/county',
                          name='Bouches-du-Rhône')
     response = self.client.get(
         url_for('territories.territory', territory=bdr))
     self.assert200(response)
     data = response.data.decode('utf-8')
     self.assertIn(bdr.name, data)
     base_datasets = self.get_context_variable('base_datasets')
     self.assertEqual(len(base_datasets), 11)
     for dataset in base_datasets:
         self.assertIn(
             '<div data-udata-territory-id="{dataset.slug}"'.format(
                 dataset=dataset), data)
Exemplo n.º 8
0
 def test_not_suggest_country(self):
     GeoZoneFactory(id='country:fr', level='country', name='France')
     response = self.get(url_for('api.suggest_territory'), qs={'q': 'fra'})
     self.assert200(response)
     results = response.json
     self.assertEqual(len(results), 0)
     response = self.get(url_for('api.suggest_territory'), qs={'q': 'fran'})
     self.assert200(response)
     results = response.json
     self.assertEqual(len(results), 0)
     response = self.get(url_for('api.suggest_territory'),
                         qs={'q': 'franc'})
     self.assert200(response)
     results = response.json
     self.assertEqual(len(results), 0)
Exemplo n.º 9
0
 def test_suggest_drom_com_by_code(self):
     guyane = GeoZoneFactory(id='fr:departement:973@1860-07-01',
                             level='fr:departement',
                             name='Guyane',
                             code='973',
                             population=250109,
                             area=0,
                             validity={
                                 'start': '1860-07-01',
                                 'end': '9999-12-31'
                             })
     response = self.get(url_for('api.suggest_territory'), qs={'q': '973'})
     self.assert200(response)
     results = response.json
     self.assertEqual(len(results), 1)
     self.assertEqual(results[0]['id'], guyane.id)
Exemplo n.º 10
0
 def test_suggest_corsica_by_county_code(self):
     haute_corse = GeoZoneFactory(id='fr:departement:2b@1976-01-01',
                                  level='fr:departement',
                                  name='Haute-Corse',
                                  code='2b',
                                  population=168640,
                                  area=0,
                                  validity={
                                      'start': '1976-01-01',
                                      'end': '9999-12-31'
                                  })
     response = self.get(url_for('api.suggest_territory'), qs={'q': '2b'})
     self.assert200(response)
     results = response.json
     self.assertEqual(len(results), 1)
     self.assertEqual(results[0]['id'], haute_corse.id)
Exemplo n.º 11
0
def known_spatial_text_slug(app):
    with app.app_context():
        zone = GeoZoneFactory(validity=None)
    data = {
        'name': faker.unique_string(),
        'title': faker.sentence(),
        'notes': faker.paragraph(),
        'resources': [{
            'url': faker.unique_url()
        }],
        'extras': [{
            'key': 'spatial-text',
            'value': zone.slug
        }]
    }
    return data, {'zone': zone}
Exemplo n.º 12
0
 def test_oembeds_api_for_territory_dataset_not_registered(self):
     '''Should raise 400 on unregistered territory dataset'''
     country = faker.country_code()
     level = 'commune'
     zone = GeoZoneFactory(level='{0}:{1}'.format(country, level),
                           validity={
                               'start': '1942-01-01',
                               'end': '9999-12-31'
                           })
     TestDataset = territory_dataset_factory()
     TERRITORY_DATASETS[level] = {}
     reference = 'territory-{0}:{1}'.format(zone.id, TestDataset.id)
     url = url_for('api.oembeds', references=reference)
     response = self.get(url)
     self.assert400(response)
     self.assertEqual(response.json['message'],
                      'Unknown territory dataset id.')
Exemplo n.º 13
0
 def test_suggest_corsica_by_code(self):
     bastia = GeoZoneFactory(id='fr:commune:2b033@1976-01-01',
                             level='fr:commune',
                             name='Bastia',
                             code='2b033',
                             population=4479,
                             area=0,
                             validity={
                                 'start': '1976-01-01',
                                 'end': '9999-12-31'
                             })
     response = self.get(url_for('api.suggest_territory'),
                         qs={'q': '2b033'})
     self.assert200(response)
     results = response.json
     self.assertEqual(len(results), 1)
     self.assertEqual(results[0]['id'], bastia.id)
Exemplo n.º 14
0
 def test_oembed_town_territory_api_get(self):
     '''It should fetch a town territory in the oembed format.'''
     arles = GeoZoneFactory(id='fr/town/13004',
                            level='fr/town',
                            name='Arles',
                            code='13004',
                            population=52439)
     licence_ouverte = LicenseFactory(id='fr-lo', title='Licence Ouverte')
     odbl_license = LicenseFactory(id='odc-odbl', title='ODbL')
     LicenseFactory(id='notspecified', title='Not Specified')
     town_datasets = TERRITORY_DATASETS['town']
     for territory_dataset_class in town_datasets.values():
         organization = OrganizationFactory(
             id=territory_dataset_class.organization_id)
         territory = territory_dataset_class(arles)
         reference = 'territory-{id}'.format(id=territory.slug)
         response = self.get(url_for('api.oembeds', references=reference))
         self.assert200(response)
         data = json.loads(response.data)[0]
         self.assertIn('html', data)
         self.assertIn('width', data)
         self.assertIn('maxwidth', data)
         self.assertIn('height', data)
         self.assertIn('maxheight', data)
         self.assertTrue(data['type'], 'rich')
         self.assertTrue(data['version'], '1.0')
         self.assertIn(territory.title, data['html'])
         self.assertIn(cgi.escape(territory.url), data['html'])
         self.assertIn('alt="{name}"'.format(name=organization.name),
                       data['html'])
         self.assertIn(md(territory.description, source_tooltip=True),
                       data['html'])
         self.assertIn('Download from localhost', data['html'])
         self.assertIn('Add to your own website', data['html'])
         if territory_dataset_class not in (town_datasets['comptes_t'], ):
             if territory_dataset_class == town_datasets['ban_odbl_t']:
                 license = odbl_license
             else:
                 license = licence_ouverte
             self.assertIn('License: {title}'.format(title=license.title),
                           data['html'])
             self.assertIn('© {license_id}'.format(license_id=license.id),
                           data['html'])
             self.assertIn(
                 '<a data-tooltip="Source" href="http://localhost/datasets',
                 data['html'])
Exemplo n.º 15
0
 def test_oembed_region_territory_api_get(self):
     '''It should fetch a region territory in the oembed format.'''
     midi_pyrenees = GeoZoneFactory(id='fr/region/73',
                                    level='fr/region',
                                    name='Midi-Pyrénées',
                                    code='73')
     licence_ouverte = LicenseFactory(id='fr-lo', title='Licence Ouverte')
     LicenseFactory(id='notspecified', title='Not Specified')
     for territory_dataset_class in TERRITORY_DATASETS['region'].values():
         organization = OrganizationFactory(
             id=territory_dataset_class.organization_id)
         territory = territory_dataset_class(midi_pyrenees)
         reference = 'territory-{id}'.format(id=territory.slug)
         response = self.get(url_for('api.oembeds', references=reference))
         self.assert200(response)
         data = json.loads(response.data)[0]
         self.assertIn('html', data)
         self.assertIn('width', data)
         self.assertIn('maxwidth', data)
         self.assertIn('height', data)
         self.assertIn('maxheight', data)
         self.assertTrue(data['type'], 'rich')
         self.assertTrue(data['version'], '1.0')
         self.assertIn(territory.title, data['html'])
         self.assertIn(cgi.escape(territory.url), data['html'])
         self.assertIn('alt="{name}"'.format(name=organization.name),
                       data['html'])
         self.assertIn(md(territory.description, source_tooltip=True),
                       data['html'])
         self.assertIn('Download from localhost', data['html'])
         self.assertIn('Add to your own website', data['html'])
         if territory_dataset_class not in (
                 TERRITORY_DATASETS['region']['comptes_r'],
                 TERRITORY_DATASETS['region']['zonages_r']):
             self.assertIn(
                 'License: {title}'.format(title=licence_ouverte.title),
                 data['html'])
             self.assertIn(
                 '© {license_id}'.format(license_id=licence_ouverte.id),
                 data['html'])
             self.assertIn(
                 '<a data-tooltip="Source" href="http://localhost/datasets',
                 data['html'])
Exemplo n.º 16
0
 def test_oembeds_api_for_territory(self):
     '''It should fetch a territory in the oembed format.'''
     country = faker.country_code().lower()
     level = 'commune'
     zone = GeoZoneFactory(level='{0}:{1}'.format(country, level))
     TestDataset = territory_dataset_factory()
     TERRITORY_DATASETS[level][TestDataset.id] = TestDataset
     reference = 'territory-{0}:{1}'.format(zone.id, TestDataset.id)
     url = url_for('api.oembeds', references=reference)
     response = self.get(url)
     self.assert200(response)
     data = json.loads(response.data)[0]
     self.assertIn('html', data)
     self.assertIn('width', data)
     self.assertIn('maxwidth', data)
     self.assertIn('height', data)
     self.assertIn('maxheight', data)
     self.assertTrue(data['type'], 'rich')
     self.assertTrue(data['version'], '1.0')
     self.assertIn(zone.name, data['html'])
     self.assertIn('placeholders/default.png', data['html'])
Exemplo n.º 17
0
    def test_only_suggest_current_zones(self):
        '''It should only suggest current zones'''
        with self.autoindex():
            for i in range(4):
                GeoZoneFactory(name='test-{0}-{1}'.format(i, 'current' if i % 2 else 'legacy'),
                               is_current=i % 2)

        response = self.get(
            url_for('api.suggest_zones'), qs={'q': 'test', 'size': '5'})
        self.assert200(response)

        self.assertEqual(len(response.json), 2)

        for suggestion in response.json:
            self.assertIn('id', suggestion)
            self.assertIn('name', suggestion)
            self.assertIn('code', suggestion)
            self.assertIn('level', suggestion)
            self.assertIn('keys', suggestion)
            self.assertIsInstance(suggestion['keys'], dict)
            self.assertTrue(suggestion['name'].endswith('-current'))
Exemplo n.º 18
0
 def test_oembeds_api_for_territory(self, api):
     '''It should fetch a territory in the oembed format.'''
     country = faker.country_code().lower()
     level = 'commune'
     zone = GeoZoneFactory(level='{0}:{1}'.format(country, level))
     TestDataset = territory_dataset_factory()
     TERRITORY_DATASETS[level][TestDataset.id] = TestDataset
     reference = 'territory-{0}:{1}'.format(zone.id, TestDataset.id)
     url = url_for('api.oembeds', references=reference)
     response = api.get(url)
     assert200(response)
     data = response.json[0]
     assert 'html' in data
     assert 'width' in data
     assert 'maxwidth' in data
     assert 'height' in data
     assert 'maxheight' in data
     assert data['type'] == 'rich'
     assert data['version'] == '1.0'
     assert zone.name in data['html']
     assert 'placeholders/default.png' in data['html']
Exemplo n.º 19
0
    def test_suggest_zones_on_name(self):
        '''It should suggest zones based on its name'''
        with self.autoindex():
            for i in range(4):
                GeoZoneFactory(name='test-{0}'.format(i)
                               if i % 2 else faker.word())

        response = self.get(
            url_for('api.suggest_zones'), qs={'q': 'test', 'size': '5'})
        self.assert200(response)

        self.assertEqual(len(response.json), 2)

        for suggestion in response.json:
            self.assertIn('id', suggestion)
            self.assertIn('name', suggestion)
            self.assertIn('code', suggestion)
            self.assertIn('level', suggestion)
            self.assertIn('keys', suggestion)
            self.assertIsInstance(suggestion['keys'], dict)
            self.assertTrue(suggestion['name'].startswith('test'))
Exemplo n.º 20
0
    def test_zones_api_many(self):
        zones = [GeoZoneFactory() for _ in range(3)]

        url = url_for('api.zones', ids=zones)
        response = self.get(url)
        self.assert200(response)

        self.assertEqual(len(response.json['features']), len(zones))

        for zone, feature in zip(zones, response.json['features']):
            self.assertEqual(feature['type'], 'Feature')
            assert_json_equal(feature['geometry'], zone.geom)
            self.assertEqual(feature['id'], zone.id)

            properties = feature['properties']
            self.assertEqual(properties['name'], zone.name)
            self.assertEqual(properties['code'], zone.code)
            self.assertEqual(properties['level'], zone.level)
            self.assertEqual(properties['parents'], zone.parents)
            self.assertEqual(properties['population'], zone.population)
            self.assertEqual(properties['area'], zone.area)
            self.assertEqual(properties['keys'], zone.keys)
            self.assertEqual(properties['logo'], zone.logo_url(external=True))
Exemplo n.º 21
0
    def test_suggest_zones_on_extra_list_key(self):
        '''It should suggest zones based on any list key'''
        with self.autoindex():
            for i in range(4):
                GeoZoneFactory(
                    name='in' if i % 2 else 'not-in',
                    keys={str(i): ['test-{0}'.format(i)
                                   if i % 2 else faker.word()]}
                )

        response = self.get(url_for('api.suggest_zones'),
                            qs={'q': 'test', 'size': '5'})
        self.assert200(response)

        self.assertEqual(len(response.json), 2)

        for suggestion in response.json:
            self.assertIn('id', suggestion)
            self.assertIn('name', suggestion)
            self.assertIn('code', suggestion)
            self.assertIn('level', suggestion)
            self.assertIn('keys', suggestion)
            self.assertIsInstance(suggestion['keys'], dict)
            self.assertEqual(suggestion['name'], 'in')
Exemplo n.º 22
0
    def test_suggest_zones_unicode(self):
        '''It should suggest zones based on its name'''
        for i in range(4):
            GeoZoneFactory(name='testé-{0}'.format(i) if i %
                           2 else faker.word(),
                           is_current=True)

        response = self.get(url_for('api.suggest_zones'),
                            qs={
                                'q': 'testé',
                                'size': '5'
                            })
        self.assert200(response)

        self.assertEqual(len(response.json), 2)

        for suggestion in response.json:
            self.assertIn('id', suggestion)
            self.assertIn('name', suggestion)
            self.assertIn('code', suggestion)
            self.assertIn('level', suggestion)
            self.assertIn('keys', suggestion)
            self.assertIsInstance(suggestion['keys'], dict)
            self.assertIn('testé', suggestion['name'])
Exemplo n.º 23
0
 def test_resolve_zone_without_slug_nor_trailing_slash(self, client):
     zone = GeoZoneFactory(validity=None)
     url = '/territory/{level}/{code}@latest'
     response = client.get(url.format(**zone._data))
     assert200(response)
Exemplo n.º 24
0
 def test_serialize_zone_without_validity(self):
     zone = GeoZoneFactory(validity=None)
     url = url_for('territory_tester', territory=zone)
     expected = '/territory/{level}/{code}@latest/{slug}'
     assert url == expected.format(**zone._data)
Exemplo n.º 25
0
 def test_serialize_default_prefix_zone_without_validity(self):
     zone = GeoZoneFactory(level='fr:level', validity=None)
     url = url_for('territory_tester', territory=zone)
     expected = '/territory/level/{code}@latest/{slug}'
     assert url == expected.format(**zone._data)
Exemplo n.º 26
0
 def test_resolve_default_prefix_zone_without_validity(self, client):
     zone = GeoZoneFactory(level='fr:level', validity=None)
     url = '/territory/level/{code}@latest/{slug}'
     response = client.get(url.format(**zone._data))
     assert200(response)
Exemplo n.º 27
0
 def test_resolve_zone_with_validity(self, client):
     zone = GeoZoneFactory()
     url = '/territory/{level}/{code}@{validity.start}/{slug}'
     response = client.get(url.format(**zone._data))
     assert200(response)
Exemplo n.º 28
0
 def test_resolve_zone_without_optionnal_slug(self, client):
     zone = GeoZoneFactory(validity=None)
     url = '/territory/{level}/{code}@latest/'
     response = client.get(url.format(**zone._data))
     assert200(response)