コード例 #1
0
def test_delete_map(client):
    with app.app_context():
        username = '******'
        mapname = 'administrativni_cleneni_libereckeho_kraje'
        rest_path = url_for('rest_workspace_map.delete_map',
                            workspace=username,
                            mapname=mapname)
        response = client.delete(rest_path)
        assert response.status_code == 200
        resp_json = response.get_json()
        uuid_str = resp_json['uuid']
        md_record_url = f"http://micka:80/record/basic/m-{uuid_str}"
        response = requests.get(md_record_url, auth=settings.CSW_BASIC_AUTHN)
        response.raise_for_status()
        assert 'Záznam nenalezen' in response.text
        assert mapname not in response.text

        publication_counter.decrease()
        uuid.check_redis_consistency(expected_publ_num_by_type={
            f'{MAP_TYPE}': publication_counter.get()
        })

    with app.app_context():
        rest_path = url_for('rest_workspace_map.delete_map',
                            workspace=username,
                            mapname=mapname)
        response = client.delete(rest_path)
        assert response.status_code == 404
        resp_json = response.get_json()
        assert resp_json['code'] == 26

        uuid.check_redis_consistency(expected_publ_num_by_type={
            f'{MAP_TYPE}': publication_counter.get()
        })
コード例 #2
0
def test_wms_workspace():
    workspace = 'test_wms_workspace_workspace'
    layername = 'test_wms_workspace_layer'

    wms_url = f"http://localhost:8000/geoserver/test_wms_workspace_workspace{settings.LAYMAN_GS_WMS_WORKSPACE_POSTFIX}/ows"
    wfs_url = f"http://localhost:8000/geoserver/test_wms_workspace_workspace/wfs"

    process_client.publish_workspace_layer(workspace, layername)
    r_json = process_client.get_workspace_layer(workspace, layername)
    assert r_json['wms']['url'] == wms_url
    assert r_json['wfs']['url'] == wfs_url

    with app.app_context():
        internal_wms_url = url_for('geoserver_proxy_bp.proxy', subpath=workspace + settings.LAYMAN_GS_WMS_WORKSPACE_POSTFIX + '/ows')
        internal_wfs_url = url_for('geoserver_proxy_bp.proxy', subpath=workspace + '/wfs')

    r_wms = requests.get(internal_wms_url, params={
        'service': 'WMS',
        'request': 'GetCapabilities',
        'version': '1.3.0',
    })
    assert r_wms.status_code == 200

    r_wfs = requests.get(internal_wfs_url, params={
        'service': 'WFS',
        'request': 'GetCapabilities',
        'version': '2.0.0',
    })
    assert r_wfs.status_code == 200

    process_client.delete_workspace_layer(workspace, layername)
コード例 #3
0
def test_parse_md_properties():
    xml_path = 'src/layman/layer/micka/util_test_filled_template.xml'
    with open(xml_path, 'r') as xml_file:
        props = common_util.parse_md_properties(xml_file, [
            'abstract',
            'extent',
            'graphic_url',
            'identifier',
            'layer_endpoint',
            'language',
            'md_date_stamp',
            'md_file_identifier',
            'md_organisation_name',
            'organisation_name',
            'publication_date',
            'reference_system',
            'scale_denominator',
            'title',
            'wfs_url',
            'wms_url',
        ], METADATA_PROPERTIES)
    with app.app_context():
        expected = {
            'md_file_identifier': 'm-ca238200-8200-1a23-9399-42c9fca53542',
            'md_date_stamp': '2007-05-25',
            'md_organisation_name': None,
            'organisation_name': None,
            'scale_denominator': None,
            'language': [],
            'reference_system': [4326, 3857],
            'title': 'CORINE - Krajinný pokryv CLC 90',
            'publication_date': '2007-05-25',
            'identifier': {
                'identifier': 'http://www.env.cz/data/corine/1990',
                'label': 'MZP-CORINE',
            },
            'abstract': None,
            'graphic_url': url_for('rest_workspace_layer_thumbnail.get', workspace='browser', layername='layer',
                                   internal=False),
            'extent': [11.87, 48.12, 19.13, 51.59],
            'wms_url': 'http://www.env.cz/corine/data/download.zip',
            'wfs_url': 'http://www.env.cz/corine/data/download.zip',
            'layer_endpoint': url_for('rest_workspace_layer.get', workspace='browser', layername='layer',
                                      internal=False),
        }
    assert set(props.keys()) == set(expected.keys())
    for k, value in props.items():
        equals_fn = COMMON_PROPERTIES[k].get('equals_fn', None)
        assert prop_equals(value, expected[k],
                           equals_fn), f"Values of property {k} do not equal: {value} != {expected[k]}"
コード例 #4
0
def test_post_maps_invalid_json(client):
    username = '******'
    rest_path = url_for('rest_workspace_maps.post', workspace=username)
    file_paths = [
        'sample/layman.map/invalid-missing-title-email.json',
    ]
    for file_path in file_paths:
        assert os.path.isfile(file_path)
    files = []
    try:
        files = [(open(fp, 'rb'), os.path.basename(fp)) for fp in file_paths]
        response = client.post(rest_path, data={
            'file': files,
        })
        assert response.status_code == 400
        resp_json = response.get_json()
        # print('resp_json', resp_json)
        assert resp_json['code'] == 2
        assert resp_json['detail']['parameter'] == 'file'
        assert resp_json['detail'][
            'reason'] == 'JSON not valid against schema layman/map/schema.draft-07.json'
        assert len(resp_json['detail']['validation-errors']) == 2
    finally:
        for file_path in files:
            file_path[0].close()

    uuid.check_redis_consistency(
        expected_publ_num_by_type={f'{MAP_TYPE}': publication_counter.get()})
コード例 #5
0
ファイル: oauth2_test.py プロジェクト: index-git/layman
def test_authn_get_current_user_without_username(client):
    rest_path = url_for('rest_current_user.get')
    response = client.get(rest_path,
                          headers={
                              f'{ISS_URL_HEADER}':
                              'http://*****:*****@liferay.com'
    assert claims['email_verified'] is True
    assert claims['family_name'] == 'Test'
    assert claims['given_name'] == 'Test'
    assert claims['middle_name'] == ''
    assert claims['name'] == 'Test Test'
    assert claims['preferred_username'] == 'test'
    assert claims['screen_name'] == 'test'
    assert claims['sub'] == '20139'
コード例 #6
0
ファイル: oauth2_test.py プロジェクト: index-git/layman
def test_token_active(client, headers):
    username = '******'
    url = url_for('rest_workspace_layers.get', workspace=username)
    response = client.get(url, headers=headers)
    assert response.status_code == 404
    resp_json = response.get_json()
    assert resp_json['code'] == 40
コード例 #7
0
ファイル: rest_users_test.py プロジェクト: index-git/layman
def test_get_users():
    username = '******'
    userinfo = {
        "issuer_id": 'mock_test_rest_user_test',
        "sub": '1',
        "claims": {
            "email": "*****@*****.**",
            "preferred_username": '******',
            "name": "test ensure user",
            "given_name": "test",
            "family_name": "user",
            "middle_name": "ensure",
        }
    }

    # Create username in layman
    with app.app_context():
        ensure_whole_user(username, userinfo)

        # users.GET
        url = url_for('rest_users.get')
        assert url.endswith('/' + settings.REST_USERS_PREFIX)

    response = requests.get(url)
    assert response.status_code == 200, response.json()
    assert username in [info["username"] for info in response.json()]
コード例 #8
0
def check_metadata(client, username, mapname, props_equal, expected_values):
    with app.app_context():
        rest_path = url_for('rest_workspace_map_metadata_comparison.get',
                            workspace=username,
                            mapname=mapname)
        response = client.get(rest_path)
        assert response.status_code == 200, response.get_json()
        resp_json = response.get_json()
        assert METADATA_PROPERTIES == set(
            resp_json['metadata_properties'].keys())
        # for k, v in resp_json['metadata_properties'].items():
        #     print(f"'{k}': {json.dumps(list(v['values'].values())[0], indent=2)},")
        for key, value in resp_json['metadata_properties'].items():
            assert value['equal_or_null'] == (
                key in props_equal
            ), f"Metadata property values have unexpected 'equal_or_null' value: {key}: {json.dumps(value, indent=2)}, sources: {json.dumps(resp_json['metadata_sources'], indent=2)}"
            assert value['equal'] == (
                key in props_equal
            ), f"Metadata property values have unexpected 'equal' value: {key}: {json.dumps(value, indent=2)}, sources: {json.dumps(resp_json['metadata_sources'], indent=2)}"
            # print(f"'{k}': {json.dumps(list(v['values'].values())[0], indent=2)},")
            if key in expected_values:
                vals = list(value['values'].values())
                vals.append(expected_values[key])
                assert prop_equals_strict(vals, equals_fn=PROPERTIES[key].get('equals_fn',
                                                                              None)),\
                    f"Property {key} has unexpected values {json.dumps(vals, indent=2)}"
コード例 #9
0
def test_no_file(client):
    response = client.post(
        url_for('rest_workspace_maps.post', workspace='testuser1'))
    assert response.status_code == 400
    resp_json = response.get_json()
    # print('resp_json', resp_json)
    assert resp_json['code'] == 1
    assert resp_json['detail']['parameter'] == 'file'
コード例 #10
0
ファイル: oauth2_test.py プロジェクト: index-git/layman
def test_no_provider_found(client, headers):
    username = '******'
    response = client.get(url_for('rest_workspace_layers.get',
                                  workspace=username),
                          headers=headers)
    assert response.status_code == 403
    resp_json = response.get_json()
    assert resp_json['code'] == 32
    assert resp_json['sub_code'] == 6
コード例 #11
0
ファイル: oauth2_test.py プロジェクト: index-git/layman
def test_auth_header_bad_first_part(client, headers):
    username = '******'
    response = client.get(url_for('rest_workspace_layers.get',
                                  workspace=username),
                          headers=headers)
    assert response.status_code == 403
    resp_json = response.get_json()
    assert resp_json['code'] == 32
    assert resp_json['sub_code'] == 4
コード例 #12
0
ファイル: oauth2_test.py プロジェクト: index-git/layman
def test_no_auth_header(client):
    username = '******'
    response = client.get(url_for('rest_workspace_layers.get',
                                  workspace=username),
                          headers={f'{ISS_URL_HEADER}': 'abc'})
    assert response.status_code == 403
    resp_json = response.get_json()
    assert resp_json['code'] == 32
    assert resp_json['sub_code'] == 2
コード例 #13
0
ファイル: oauth2_test.py プロジェクト: index-git/layman
def test_unexisting_introspection_url(client, headers):
    username = '******'
    response = client.get(url_for('rest_workspace_layers.get',
                                  workspace=username),
                          headers=headers)
    assert response.status_code == 403
    resp_json = response.get_json()
    assert resp_json['code'] == 32
    assert resp_json['sub_code'] == 8
コード例 #14
0
def test_get_maps():
    username = '******'
    mapname = 'test_get_maps_map'

    process_client.publish_workspace_map(username, mapname, title=mapname)

    with app.app_context():
        url_get = url_for('rest_workspace_maps.get', workspace=username)
    # maps.GET
    response = requests.get(url_get)
    assert response.status_code == 200, response.json()

    assert response.json()[0]['name'] == mapname
    assert response.json()[0]['title'] == mapname
    with app.app_context():
        assert response.json()[0]['url'] == url_for('rest_workspace_map.get', workspace=username, mapname=mapname,
                                                    internal=False)

    process_client.delete_workspace_map(username, mapname)
コード例 #15
0
ファイル: oauth2_test.py プロジェクト: index-git/layman
def test_get_current_user_anonymous(client):
    rest_path = url_for('rest_current_user.get')
    response = client.get(rest_path)
    assert response.status_code == 200
    resp_json = response.get_json()
    assert resp_json['authenticated'] is False, resp_json
    assert {'authenticated', 'claims'} == set(resp_json.keys()), resp_json
    claims = resp_json['claims']
    assert {'iss', 'name', 'nickname'} == set(claims.keys()), claims
    assert claims['name'] == 'Anonymous', claims
    assert claims['nickname'] == 'Anonymous', claims
コード例 #16
0
def test_get_maps_empty(client):
    username = '******'
    flask_client.ensure_workspace(username, client)
    with app.app_context():
        response = client.get(
            url_for('rest_workspace_maps.get', workspace=username))
        resp_json = response.get_json()
        assert response.status_code == 200, response.data
        assert len(resp_json) == 0

        uuid.check_redis_consistency(expected_publ_num_by_type={
            f'{MAP_TYPE}': publication_counter.get()
        })
コード例 #17
0
def test_style_value():
    username = '******'
    layername = 'test_style_value_layer'

    process_client.publish_workspace_layer(username, layername)

    with app.app_context():
        layer_url = url_for('rest_workspace_layer.get',
                            workspace=username,
                            layername=layername)
        expected_style_url = url_for('rest_workspace_layer_style.get',
                                     workspace=username,
                                     layername=layername,
                                     internal=False)
    response = requests.get(layer_url)
    assert response.status_code == 200, response.text
    resp_json = json.loads(response.text)

    assert 'style' in resp_json, response.text
    assert 'url' in resp_json['style'], response.text
    assert 'status' not in resp_json['style'], response.text

    external_style_url = resp_json['style']['url']
    assert external_style_url == expected_style_url, (response.text,
                                                      external_style_url)

    with app.app_context():
        style_url = url_for('rest_workspace_layer_style.get',
                            workspace=username,
                            layername=layername)

    r_get = requests.get(style_url)
    assert r_get.status_code == 200, (r_get.text, style_url)

    r_del = requests.delete(style_url)
    assert r_del.status_code >= 400, (r_del.text, style_url)

    process_client.delete_workspace_layer(username, layername)
コード例 #18
0
def test_wrong_value_of_mapname(client):
    username = '******'
    mapnames = [' ', '2a', 'ě', ';', '?', 'ABC']
    for mapname in mapnames:
        response = client.get(
            url_for('rest_workspace_map.get',
                    workspace=username,
                    mapname=mapname))
        resp_json = response.get_json()
        # print('username', username)
        # print(resp_json)
        assert response.status_code == 400
        assert resp_json['code'] == 2
        assert resp_json['detail']['parameter'] == 'mapname'
コード例 #19
0
ファイル: authz_test.py プロジェクト: index-git/layman
    def test_authorize_publications_decorator_on_rest_api(
        self,
        rest_action,
        url_for_params,
        authz_status_code,
        authz_response,
        unauthz_status_code,
        unauthz_response,
    ):
        username = self.username
        authz_headers = self.authz_headers
        patch_method = None
        publ_name = None
        if '_layer' in rest_action:
            patch_method = process_client.patch_workspace_layer
            publ_name = self.layername
        elif '_map' in rest_action:
            patch_method = process_client.patch_workspace_map
            publ_name = self.mapname
        assert publ_name

        url_for_params['workspace'] = username

        with app.app_context():
            rest_url = url_for(rest_action, **url_for_params)

        patch_method(username,
                     publ_name,
                     headers=authz_headers,
                     access_rights={
                         'read': username,
                         'write': username,
                     })
        response = requests.get(rest_url, headers=authz_headers)
        self.assert_response(response, authz_status_code, authz_response)
        response = requests.get(rest_url)
        self.assert_response(response, unauthz_status_code, unauthz_response)

        patch_method(username,
                     publ_name,
                     headers=authz_headers,
                     access_rights={
                         'read': settings.RIGHTS_EVERYONE_ROLE,
                         'write': settings.RIGHTS_EVERYONE_ROLE,
                     })
        response = requests.get(rest_url, headers=authz_headers)
        self.assert_response(response, authz_status_code, authz_response)
        response = requests.get(rest_url)
        self.assert_response(response, authz_status_code, authz_response)
コード例 #20
0
def test_get_layer_style_sld():
    username = '******'
    layername = 'test_get_layer_style_sld_layer'

    process_client.publish_workspace_layer(
        username,
        layername,
    )

    with app.app_context():
        rest_url = url_for('rest_workspace_layer_style.get',
                           workspace=username,
                           layername=layername)
    response = requests.get(rest_url)
    assert response.status_code == 200, response.text
    # lxml does not support importing from utf8 string
    xml_tree = ET.fromstring(bytes(response.text, encoding='utf8'))
    assert ET.QName(
        xml_tree
    ) == "{http://www.opengis.net/sld}StyledLayerDescriptor", response.text
    process_client.delete_workspace_layer(username, layername)
コード例 #21
0
ファイル: qgis_test.py プロジェクト: index-git/layman
def test_qgis_rest():
    workspace = 'test_qgis_rest_workspace'
    layer = 'test_qgis_rest_workspace_layer'
    source_style_file_path = 'sample/style/small_layer.qml'
    workspace_directory = f'{settings.LAYMAN_QGIS_DATA_DIR}/workspaces/{workspace}'
    layer_directory = f'{workspace_directory}/layers/{layer}'

    assert not os.path.exists(workspace_directory)
    assert not os.path.exists(layer_directory)

    process_client.publish_workspace_layer(workspace,
                                           layer,
                                           style_file=source_style_file_path)
    assert os.path.exists(workspace_directory)
    assert os.path.exists(layer_directory)
    with app.app_context():
        url = url_for('rest_workspace_layer_style.get',
                      workspace=workspace,
                      layername=layer,
                      internal=False)
        assert wms.get_layer_info(workspace, layer) == {
            'name': layer,
            'style': {
                'type': 'qml',
                'url': url
            },
            '_wms': {
                'qgis_capabilities_url':
                f'{settings.LAYMAN_QGIS_URL}?SERVICE=WMS&REQUEST=GetCapabilities&VERSION=1.1.1&map=/qgis/data/test/workspaces/{workspace}/layers/{layer}/{layer}.qgis'
            }
        }
        assert workspace in qgis.get_workspaces()

    process_client.delete_workspace_layer(workspace, layer)
    assert os.path.exists(workspace_directory)
    assert not os.path.exists(layer_directory)
    with app.app_context():
        assert wms.get_layer_info(workspace, layer) == {}
        assert workspace in qgis.get_workspaces()
コード例 #22
0
def test_get_layer_style_qml():
    username = '******'
    layername = 'test_get_layer_style_sld_layer'
    qml_file = 'sample/style/small_layer.qml'

    process_client.publish_workspace_layer(username,
                                           layername,
                                           style_file=qml_file)

    with app.app_context():
        rest_url = url_for('rest_workspace_layer_style.get',
                           workspace=username,
                           layername=layername)
    response = requests.get(rest_url)
    assert response.status_code == 200, response.text
    # lxml does not support importing from utf8 string
    xml_el = ET.fromstring(bytes(response.text, encoding='utf8'))
    assert ET.QName(xml_el), response.text
    assert ET.QName(xml_el) == "qgis", response.text
    assert len(xml_el.xpath('/qgis/renderer-v2')) == 1, response.text
    assert xml_el.attrib, response.text
    process_client.delete_workspace_layer(username, layername)
コード例 #23
0
def test_get_map_title():
    username = '******'
    maps = [("c_test_get_map_title_map", "C Test get map title - map title íářžý"),
            ("a_test_get_map_title_map", "A Test get map title - map title íářžý"),
            ("b_test_get_map_title_map", "B Test get map title - map title íářžý")
            ]
    sorted_maps = sorted(maps)

    for (name, title) in maps:
        process_client.publish_workspace_map(username, name, title=title)

    with app.app_context():
        url_get = url_for('rest_workspace_maps.get', workspace=username)
    # maps.GET
    response = requests.get(url_get)
    assert response.status_code == 200, response.json()

    for i in range(0, len(sorted_maps) - 1):
        assert response.json()[i]["name"] == sorted_maps[i][0]
        assert response.json()[i]["title"] == sorted_maps[i][1]

    for (name, title) in maps:
        process_client.delete_workspace_map(username, name)
コード例 #24
0
def test_post_maps_invalid_file(client):
    username = '******'
    rest_path = url_for('rest_workspace_maps.post', workspace=username)
    file_paths = [
        'sample/style/generic-blue_sld.xml',
    ]
    for file_path in file_paths:
        assert os.path.isfile(file_path)
    files = []
    try:
        files = [(open(fp, 'rb'), os.path.basename(fp)) for fp in file_paths]
        response = client.post(rest_path, data={
            'file': files,
        })
        assert response.status_code == 400
        resp_json = response.get_json()
        # print('resp_json', resp_json)
        assert resp_json['code'] == 2
        assert resp_json['detail']['parameter'] == 'file'
        assert resp_json['detail']['reason'] == 'Invalid JSON syntax'
    finally:
        for file_path in files:
            file_path[0].close()
コード例 #25
0
ファイル: rest_about_test.py プロジェクト: index-git/layman
def test_version():
    with app.app_context():
        r_url = url_for('rest_about.get_version')
    response = requests.get(r_url)
    process_client.raise_layman_error(response)
    result = response.json()
    assert 'about' in result.keys()
    assert 'applications' in result['about'].keys()
    assert 'layman' in result['about']['applications'].keys()
    assert 'version' in result['about']['applications']['layman'].keys()
    assert 'release-timestamp' in result['about']['applications'][
        'layman'].keys()

    assert 'layman-test-client' in result['about']['applications'].keys()
    assert 'version' in result['about']['applications'][
        'layman-test-client'].keys()

    assert 'data' in result['about'].keys()
    assert 'layman' in result['about']['data'].keys()
    assert 'last-migration' in result['about']['data']['layman'].keys()
    assert 'last-data-migration' in result['about']['data']['layman'].keys()
    assert 'last-schema-migration' in result['about']['data']['layman'].keys()
    assert result['about']['data']['layman']['last-migration'] == result[
        'about']['data']['layman']['last-schema-migration']
コード例 #26
0
def test_map_composed_from_local_layers(client):
    with app.app_context():
        username = '******'
        rest_path = url_for('rest_workspace_layers.post', workspace=username)

        layername1 = 'mista'
        pattern = os.path.join(
            os.getcwd(),
            'tmp/naturalearth/110m/cultural/ne_110m_populated_places.*')
        file_paths = glob.glob(pattern)
        assert len(file_paths) > 0
        for file in file_paths:
            assert os.path.isfile(file)
        files = []
        try:
            files = [(open(fp, 'rb'), os.path.basename(fp))
                     for fp in file_paths]
            response = client.post(rest_path,
                                   data={
                                       'file': files,
                                       'name': layername1,
                                   })
            assert response.status_code == 200
            layer1uuid = response.get_json()[0]['uuid']
        finally:
            for file in files:
                file[0].close()

    # If no sleep, Micka throws 500
    # [2020-03-26 09-54-11] Dibi\UniqueConstraintViolationException: duplicate key value violates unique constraint "edit_md_pkey" DETAIL:  Key (recno)=(17) already exists. SCHEMA NAME:  public TABLE NAME:  edit_md CONSTRAINT NAME:  edit_md_pkey LOCATION:  _bt_check_unique, nbtinsert.c:434 #23505 in /var/www/html/Micka/php/vendor/dibi/dibi/src/Dibi/Drivers/PostgreDriver.php:150  @  http://localhost:3080/csw  @@  exception--2020-03-26--09-54--3f034f5a61.html
    # in /var/www/html/Micka/php/app/model/RecordModel.php, line 197 setEditMd2Md INSERT INTO ...
    # probably problem with concurrent CSW insert
    # so report bug to Micka
    time.sleep(0.3)

    with app.app_context():
        layername2 = 'hranice'
        pattern = os.path.join(
            os.getcwd(),
            'tmp/naturalearth/110m/cultural/ne_110m_admin_0_boundary_lines_land.*'
        )
        file_paths = glob.glob(pattern)
        assert len(file_paths) > 0
        for file in file_paths:
            assert os.path.isfile(file)
        files = []
        try:
            files = [(open(fp, 'rb'), os.path.basename(fp))
                     for fp in file_paths]
            response = client.post(rest_path,
                                   data={
                                       'file': files,
                                       'name': layername2,
                                   })
            assert response.status_code == 200
            layer2uuid = response.get_json()[0]['uuid']
        finally:
            for file in files:
                file[0].close()

    with app.app_context():
        keys_to_check = ['db_table', 'wms', 'wfs', 'thumbnail', 'metadata']
        layer_info = client.get(
            url_for('rest_workspace_layer.get',
                    workspace=username,
                    layername=layername1)).get_json()
        max_attempts = 100
        num_attempts = 1
    while num_attempts < max_attempts and any(
        ('status' in layer_info[key] for key in keys_to_check)):
        time.sleep(0.1)
        # print('layer_info1', layer_info)
        with app.app_context():
            layer_info = client.get(
                url_for('rest_workspace_layer.get',
                        workspace=username,
                        layername=layername1)).get_json()
        num_attempts += 1
    assert num_attempts < max_attempts, f"Max attempts reached, layer1info={layer_info}"
    wms_url1 = layer_info['wms']['url']

    with app.app_context():
        layer_info = client.get(
            url_for('rest_workspace_layer.get',
                    workspace=username,
                    layername=layername2)).get_json()
        num_attempts = 1
    while any(('status' in layer_info[key] for key in keys_to_check)):
        time.sleep(0.1)
        # print('layer_info2', layer_info)
        with app.app_context():
            layer_info = client.get(
                url_for('rest_workspace_layer.get',
                        workspace=username,
                        layername=layername2)).get_json()
        num_attempts += 1
    assert num_attempts < max_attempts, f"Max attempts reached, layer2info={layer_info}"
    wms_url2 = layer_info['wms']['url']

    expected_url = 'http://localhost:8000/geoserver/testuser1_wms/ows'
    assert wms_url1 == expected_url
    assert wms_url2 == expected_url

    with app.app_context():
        mapname = 'svet'
        rest_path = url_for('rest_workspace_maps.post', workspace=username)
        file_paths = [
            'sample/layman.map/internal_url.json',
        ]
        for file in file_paths:
            assert os.path.isfile(file)
        files = []
        try:
            files = [(open(fp, 'rb'), os.path.basename(fp))
                     for fp in file_paths]
            response = client.post(rest_path,
                                   data={
                                       'file': files,
                                       'name': mapname,
                                   })
            assert response.status_code == 200
            resp_json = response.get_json()
            # print('resp_json', resp_json)
            assert len(resp_json) == 1
            assert resp_json[0]['name'] == mapname
        finally:
            for file_path in files:
                file_path[0].close()

    with app.app_context():
        map_info = client.get(
            url_for('rest_workspace_map.get',
                    workspace=username,
                    mapname=mapname)).get_json()
        thumbnail = map_info['thumbnail']
        assert 'status' in thumbnail
        assert thumbnail['status'] in ['PENDING', 'STARTED']

    with app.app_context():
        map_info = client.get(
            url_for('rest_workspace_map.get',
                    workspace=username,
                    mapname=mapname)).get_json()
    while 'status' in map_info['thumbnail'] and map_info['thumbnail'][
            'status'] in ['PENDING', 'STARTED', 'SUCCESS']:
        time.sleep(0.1)
        with app.app_context():
            map_info = client.get(
                url_for('rest_workspace_map.get',
                        workspace=username,
                        mapname=mapname)).get_json()

    with app.app_context():
        response = client.get(
            url_for('rest_workspace_map.get',
                    workspace=username,
                    mapname=mapname))
        assert response.status_code == 200
        resp_json = response.get_json()
        thumbnail = resp_json['thumbnail']
        assert 'status' not in thumbnail
        assert 'path' in thumbnail
        assert thumbnail['url'] == url_for_external(
            'rest_workspace_map_thumbnail.get',
            workspace=username,
            mapname=mapname)

        # uuid.check_redis_consistency(expected_publ_num_by_type={
        #     f'{MAP_TYPE}': num_maps_before_test + 2
        # })

    with app.app_context():
        map_info = client.get(
            url_for('rest_workspace_map.get',
                    workspace=username,
                    mapname=mapname)).get_json()
    while 'status' in map_info['metadata'] and map_info['metadata'][
            'status'] in ['PENDING', 'STARTED']:
        time.sleep(0.1)
        with app.app_context():
            map_info = client.get(
                url_for('rest_workspace_map.get',
                        workspace=username,
                        mapname=mapname)).get_json()

    with app.app_context():
        # assert metadata file is the same as filled template except for UUID and dates
        template_path, prop_values = csw.get_template_path_and_values(
            username, mapname, http_method='post')
        xml_file_object = micka_common_util.fill_xml_template_as_pretty_file_object(
            template_path, prop_values, csw.METADATA_PROPERTIES)
        expected_path = 'src/layman/map/rest_test_filled_template.xml'
        with open(expected_path) as file:
            expected_lines = file.readlines()
        diff_lines = list(
            difflib.unified_diff(
                [line.decode('utf-8') for line in xml_file_object.readlines()],
                expected_lines))
        assert len(diff_lines) == 40, ''.join(diff_lines)
        plus_lines = [line for line in diff_lines if line.startswith('+ ')]
        assert len(plus_lines) == 5
        minus_lines = [line for line in diff_lines if line.startswith('- ')]
        assert len(minus_lines) == 5

        plus_line = plus_lines[0]
        assert plus_line == '+    <gco:CharacterString>m-91147a27-1ff4-4242-ba6d-faffb92224c6</gco:CharacterString>\n'
        minus_line = minus_lines[0]
        assert minus_line.startswith(
            '-    <gco:CharacterString>m') and minus_line.endswith(
                '</gco:CharacterString>\n')

        plus_line = plus_lines[1]
        assert plus_line == '+    <gco:Date>2007-05-25</gco:Date>\n'
        minus_line = minus_lines[1]
        assert minus_line.startswith(
            '-    <gco:Date>') and minus_line.endswith('</gco:Date>\n')

        plus_line = plus_lines[2]
        assert plus_line == '+                <gco:Date>2007-05-25</gco:Date>\n'
        minus_line = minus_lines[2]
        assert minus_line.startswith('-                <gco:Date>'
                                     ) and minus_line.endswith('</gco:Date>\n')

        plus_line = plus_lines[3]
        assert plus_line.startswith(
            '+      <srv:operatesOn xlink:href="http://localhost:3080/csw?SERVICE=CSW&amp;VERSION=2.0.2&amp;REQUEST=GetRecordById&amp;OUTPUTSCHEMA=http://www.isotc211.org/2005/gmd&amp;ID='
        ) and plus_line.endswith(
            '" xlink:title="hranice" xlink:type="simple"/>\n'), plus_line
        minus_line = minus_lines[3]
        assert minus_line.startswith(
            '-      <srv:operatesOn xlink:href="http://localhost:3080/csw?SERVICE=CSW&amp;VERSION=2.0.2&amp;REQUEST=GetRecordById&amp;OUTPUTSCHEMA=http://www.isotc211.org/2005/gmd&amp;ID='
        ) and minus_line.endswith(
            '" xlink:title="hranice" xlink:type="simple"/>\n'), minus_line

        plus_line = plus_lines[4]
        assert plus_line.startswith(
            '+      <srv:operatesOn xlink:href="http://localhost:3080/csw?SERVICE=CSW&amp;VERSION=2.0.2&amp;REQUEST=GetRecordById&amp;OUTPUTSCHEMA=http://www.isotc211.org/2005/gmd&amp;ID='
        ) and plus_line.endswith(
            '" xlink:title="mista" xlink:type="simple"/>\n'), plus_line
        minus_line = minus_lines[4]
        assert minus_line.startswith(
            '-      <srv:operatesOn xlink:href="http://localhost:3080/csw?SERVICE=CSW&amp;VERSION=2.0.2&amp;REQUEST=GetRecordById&amp;OUTPUTSCHEMA=http://www.isotc211.org/2005/gmd&amp;ID='
        ) and minus_line.endswith(
            '" xlink:title="mista" xlink:type="simple"/>\n'), minus_line

    with app.app_context():
        expected_md_values = {
            'abstract':
            "World places and boundaries abstract",
            'extent': [-35.0, -48.5, 179.0, 81.5],
            'graphic_url':
            url_for_external('rest_workspace_map_thumbnail.get',
                             workspace=username,
                             mapname=mapname),
            'identifier': {
                "identifier":
                url_for_external('rest_workspace_map.get',
                                 workspace=username,
                                 mapname=mapname),
                "label":
                "svet"
            },
            'map_endpoint':
            url_for_external('rest_workspace_map.get',
                             workspace=username,
                             mapname=mapname),
            'map_file_endpoint':
            url_for_external('rest_workspace_map_file.get',
                             workspace=username,
                             mapname=mapname),
            'operates_on': [{
                "xlink:href":
                f"http://localhost:3080/csw?SERVICE=CSW&VERSION=2.0.2&REQUEST=GetRecordById&OUTPUTSCHEMA=http://www.isotc211.org/2005/gmd&ID=m-{layer2uuid}#_m-{layer2uuid}",
                "xlink:title": "hranice"
            }, {
                "xlink:href":
                f"http://localhost:3080/csw?SERVICE=CSW&VERSION=2.0.2&REQUEST=GetRecordById&OUTPUTSCHEMA=http://www.isotc211.org/2005/gmd&ID=m-{layer1uuid}#_m-{layer1uuid}",
                "xlink:title": "mista"
            }],
            'organisation_name':
            None,
            'publication_date':
            TODAY_DATE,
            'reference_system': [3857],
            'revision_date':
            None,
            'title':
            "World places and boundaries",
        }
    check_metadata(client, username, mapname, METADATA_PROPERTIES_EQUAL,
                   expected_md_values)
コード例 #27
0
def test_patch_map(client):
    with app.app_context():
        username = '******'
        mapname = 'administrativni_cleneni_libereckeho_kraje'
        uuid_str = map_uuid.get_map_uuid(username, mapname)
        rest_path = url_for('rest_workspace_map.patch',
                            workspace=username,
                            mapname=mapname)

        file_paths = [
            'sample/layman.map/full2.json',
        ]
        for file in file_paths:
            assert os.path.isfile(file)
        files = []
        try:
            files = [(open(fp, 'rb'), os.path.basename(fp))
                     for fp in file_paths]
            response = client.patch(rest_path, data={
                'file': files,
            })
            assert response.status_code == 200
            resp_json = response.get_json()
            # print('resp_json', resp_json)
        finally:
            for file in files:
                file[0].close()

        uuid.check_redis_consistency(expected_publ_num_by_type={
            f'{MAP_TYPE}': publication_counter.get()
        })

        assert resp_json['uuid'] == uuid_str
        assert resp_json['url'] == url_for_external('rest_workspace_map.get',
                                                    workspace=username,
                                                    mapname=mapname)
        assert resp_json[
            'title'] == "Jiné administrativn\u00ed \u010dlen\u011bn\u00ed Libereck\u00e9ho kraje"
        assert resp_json['description'] == "Jiný popis"
        map_file = resp_json['file']
        assert 'status' not in map_file
        assert 'path' in map_file
        assert map_file['url'] == url_for_external(
            'rest_workspace_map_file.get', workspace=username, mapname=mapname)
        thumbnail = resp_json['thumbnail']
        assert 'status' in thumbnail
        assert thumbnail['status'] in ['PENDING', 'STARTED']

    with app.app_context():
        map_info = client.get(
            url_for('rest_workspace_map.get',
                    workspace=username,
                    mapname=mapname)).get_json()
    while 'status' in map_info['thumbnail'] and map_info['thumbnail'][
            'status'] in ['PENDING', 'STARTED']:
        time.sleep(0.1)
        with app.app_context():
            map_info = client.get(
                url_for('rest_workspace_map.get',
                        workspace=username,
                        mapname=mapname)).get_json()

    with app.app_context():
        response = client.get(
            url_for('rest_workspace_map.get',
                    workspace=username,
                    mapname=mapname))
        assert response.status_code == 200
        resp_json = response.get_json()
        thumbnail = resp_json['thumbnail']
        assert 'status' not in thumbnail
        assert 'path' in thumbnail
        assert thumbnail['url'] == url_for_external(
            'rest_workspace_map_thumbnail.get',
            workspace=username,
            mapname=mapname)

    with app.app_context():
        response = client.get(
            url_for('rest_workspace_map_file.get',
                    workspace=username,
                    mapname=mapname))
        assert response.status_code == 200
        resp_json = response.get_json()
        assert resp_json['name'] == mapname
        assert resp_json[
            'title'] == "Jiné administrativn\u00ed \u010dlen\u011bn\u00ed Libereck\u00e9ho kraje"
        assert resp_json['abstract'] == "Jiný popis"
        user_json = resp_json['user']
        assert user_json['name'] == username
        assert user_json['email'] == ''
        assert len(user_json) == 2
        assert 'groups' not in resp_json

    with app.app_context():
        map_info = client.get(
            url_for('rest_workspace_map.get',
                    workspace=username,
                    mapname=mapname)).get_json()
    while 'status' in map_info['metadata'] and map_info['metadata'][
            'status'] in ['PENDING', 'STARTED']:
        time.sleep(0.1)
        with app.app_context():
            map_info = client.get(
                url_for('rest_workspace_map.get',
                        workspace=username,
                        mapname=mapname)).get_json()

    with app.app_context():
        title = 'Nový název'
        response = client.patch(rest_path, data={
            'title': title,
        })
        assert response.status_code == 200, response.get_json()
        resp_json = response.get_json()
        assert resp_json['title'] == "Nový název"
        assert resp_json['description'] == "Jiný popis"

    with app.app_context():
        description = 'Nový popis'
        response = client.patch(rest_path, data={
            'description': description,
        })
        assert response.status_code == 200
        resp_json = response.get_json()
        assert resp_json['title'] == "Nový název"
        assert resp_json['description'] == "Nový popis"

        uuid.check_redis_consistency(expected_publ_num_by_type={
            f'{MAP_TYPE}': publication_counter.get()
        })

    with app.app_context():
        expected_md_values = {
            'abstract':
            "Nov\u00fd popis",
            'extent': [14.623, 50.58, 15.42, 50.82],
            'graphic_url':
            url_for_external('rest_workspace_map_thumbnail.get',
                             workspace=username,
                             mapname=mapname),
            'identifier': {
                "identifier":
                url_for_external('rest_workspace_map.get',
                                 workspace=username,
                                 mapname=mapname),
                "label":
                "administrativni_cleneni_libereckeho_kraje"
            },
            'map_endpoint':
            url_for_external('rest_workspace_map.get',
                             workspace=username,
                             mapname=mapname),
            'map_file_endpoint':
            url_for_external('rest_workspace_map_file.get',
                             workspace=username,
                             mapname=mapname),
            'operates_on': [],
            'organisation_name':
            None,
            'publication_date':
            TODAY_DATE,
            'reference_system': [3857],
            'revision_date':
            TODAY_DATE,
            'title':
            "Nov\u00fd n\u00e1zev",
        }
    check_metadata(client, username, mapname, METADATA_PROPERTIES_EQUAL,
                   expected_md_values)
コード例 #28
0
def test_post_maps_complex(client):
    with app.app_context():
        username = '******'
        mapname = 'libe'
        title = 'Liberecký kraj: Administrativní členění'
        description = 'Libovolný popis'
        rest_path = url_for('rest_workspace_maps.post', workspace=username)
        file_paths = [
            'sample/layman.map/full.json',
        ]
        for file_path in file_paths:
            assert os.path.isfile(file_path)
        files = []
        try:
            files = [(open(fp, 'rb'), os.path.basename(fp))
                     for fp in file_paths]
            response = client.post(rest_path,
                                   data={
                                       'file': files,
                                       'name': mapname,
                                       'title': title,
                                       'description': description,
                                   })
            assert response.status_code == 200
            resp_json = response.get_json()
            # print('resp_json', resp_json)
            assert len(resp_json) == 1
            assert resp_json[0]['name'] == mapname
            uuid_str = resp_json[0]['uuid']
        finally:
            for file_path in files:
                file_path[0].close()

        publication_counter.increase()
        uuid.check_redis_consistency(expected_publ_num_by_type={
            f'{MAP_TYPE}': publication_counter.get()
        })

    with app.app_context():
        response = client.get(
            url_for('rest_workspace_map.get',
                    workspace=username,
                    mapname=mapname))
        assert response.status_code == 200
        resp_json = response.get_json()
        assert resp_json['name'] == mapname
        assert resp_json['uuid'] == uuid_str
        assert resp_json['url'] == url_for_external('rest_workspace_map.get',
                                                    workspace=username,
                                                    mapname=mapname)
        assert resp_json['title'] == title
        assert resp_json['description'] == description
        map_file = resp_json['file']
        assert 'status' not in map_file
        assert 'path' in map_file
        assert map_file['url'] == url_for_external(
            'rest_workspace_map_file.get', workspace=username, mapname=mapname)
        thumbnail = resp_json['thumbnail']
        assert 'status' in thumbnail
        assert thumbnail['status'] in ['PENDING', 'STARTED']

    with app.app_context():
        # assert another PATCH is not possible now
        response = client.patch(url_for('rest_workspace_map.patch',
                                        workspace=username,
                                        mapname=mapname),
                                data={
                                    'title': 'abcd',
                                })
        assert response.status_code == 400
        resp_json = response.get_json()
        assert resp_json['code'] == 49

    # continue with thumbnail assertion
    with app.app_context():
        map_info = client.get(
            url_for('rest_workspace_map.get',
                    workspace=username,
                    mapname=mapname)).get_json()
    while 'status' in map_info['thumbnail'] and map_info['thumbnail'][
            'status'] in ['PENDING', 'STARTED']:
        time.sleep(0.1)
        with app.app_context():
            map_info = client.get(
                url_for('rest_workspace_map.get',
                        workspace=username,
                        mapname=mapname)).get_json()

    with app.app_context():
        response = client.get(
            url_for('rest_workspace_map.get',
                    workspace=username,
                    mapname=mapname))
        assert response.status_code == 200
        resp_json = response.get_json()
        thumbnail = resp_json['thumbnail']
        assert 'status' not in thumbnail
        assert 'path' in thumbnail
        assert thumbnail['url'] == url_for_external(
            'rest_workspace_map_thumbnail.get',
            workspace=username,
            mapname=mapname)

    with app.app_context():
        response = client.get(
            url_for('rest_workspace_map_file.get',
                    workspace=username,
                    mapname=mapname))
        assert response.status_code == 200
        resp_json = response.get_json()
        assert resp_json['name'] == mapname
        assert resp_json['title'] == title
        assert resp_json['abstract'] == description
        user_json = resp_json['user']
        assert user_json['name'] == username
        assert user_json['email'] == ''
        assert len(user_json) == 2
        assert 'groups' not in resp_json

    # continue with metadata assertion
    with app.app_context():
        map_info = client.get(
            url_for('rest_workspace_map.get',
                    workspace=username,
                    mapname=mapname)).get_json()
    while 'status' in map_info['metadata'] and map_info['metadata'][
            'status'] in ['PENDING', 'STARTED']:
        time.sleep(0.1)
        with app.app_context():
            map_info = client.get(
                url_for('rest_workspace_map.get',
                        workspace=username,
                        mapname=mapname)).get_json()

    with app.app_context():
        expected_md_values = {
            'abstract':
            "Libovoln\u00fd popis",
            'extent': [14.62, 50.58, 15.42, 50.82],
            'graphic_url':
            url_for_external('rest_workspace_map_thumbnail.get',
                             workspace=username,
                             mapname=mapname),
            'identifier': {
                "identifier":
                url_for_external('rest_workspace_map.get',
                                 workspace=username,
                                 mapname=mapname),
                "label":
                "libe"
            },
            'map_endpoint':
            url_for_external('rest_workspace_map.get',
                             workspace=username,
                             mapname=mapname),
            'map_file_endpoint':
            url_for_external('rest_workspace_map_file.get',
                             workspace=username,
                             mapname=mapname),
            'operates_on': [],
            'organisation_name':
            None,
            'publication_date':
            TODAY_DATE,
            'reference_system': [3857],
            'revision_date':
            None,
            'title':
            "Libereck\u00fd kraj: Administrativn\u00ed \u010dlen\u011bn\u00ed",
        }
    check_metadata(client, username, mapname, METADATA_PROPERTIES_EQUAL,
                   expected_md_values)
コード例 #29
0
def test_post_maps_simple(client):
    with app.app_context():
        username = '******'
        mapname = None
        expected_mapname = 'administrativni_cleneni_libereckeho_kraje'
        rest_path = url_for('rest_workspace_maps.post', workspace=username)
        file_paths = [
            'sample/layman.map/full.json',
        ]
        for file_path in file_paths:
            assert os.path.isfile(file_path)
        files = []
        try:
            files = [(open(fp, 'rb'), os.path.basename(fp))
                     for fp in file_paths]
            response = client.post(rest_path, data={
                'file': files,
            })
            assert response.status_code == 200
            resp_json = response.get_json()
            # print('resp_json', resp_json)
            assert len(resp_json) == 1
            assert resp_json[0]['name'] == expected_mapname
            mapname = resp_json[0]['name']
            uuid_str = resp_json[0]['uuid']
        finally:
            for file_path in files:
                file_path[0].close()

        assert uuid.is_valid_uuid(uuid_str)

        publication_counter.increase()
        uuid.check_redis_consistency(expected_publ_num_by_type={
            f'{MAP_TYPE}': publication_counter.get()
        })

    with app.app_context():
        response = client.get(
            url_for('rest_workspace_map.get',
                    workspace=username,
                    mapname=mapname))
        assert response.status_code == 200
        resp_json = response.get_json()
        assert resp_json['name'] == mapname
        assert resp_json['uuid'] == uuid_str
        assert resp_json['url'] == url_for_external('rest_workspace_map.get',
                                                    workspace=username,
                                                    mapname=mapname)
        assert resp_json[
            'title'] == "Administrativn\u00ed \u010dlen\u011bn\u00ed Libereck\u00e9ho kraje"
        assert resp_json[
            'description'] == "Na tematick\u00e9 map\u011b p\u0159i p\u0159ibl\u00ed\u017een\u00ed jsou postupn\u011b zobrazovan\u00e9 administrativn\u00ed celky Libereck\u00e9ho kraje : okresy, OP\u00da, ORP a obce."
        map_file = resp_json['file']
        assert 'status' not in map_file
        assert 'path' in map_file
        assert map_file['url'] == url_for_external(
            'rest_workspace_map_file.get', workspace=username, mapname=mapname)
        thumbnail = resp_json['thumbnail']
        assert 'status' in thumbnail
        assert thumbnail['status'] in ['PENDING', 'STARTED']
        assert 'id' not in resp_json.keys()
        assert 'type' not in resp_json.keys()

    with app.app_context():
        map_info = client.get(
            url_for('rest_workspace_map.get',
                    workspace=username,
                    mapname=mapname)).get_json()
    while 'status' in map_info['thumbnail'] and map_info['thumbnail'][
            'status'] in ['PENDING', 'STARTED']:
        time.sleep(0.1)
        with app.app_context():
            map_info = client.get(
                url_for('rest_workspace_map.get',
                        workspace=username,
                        mapname=mapname)).get_json()

    with app.app_context():
        response = client.get(
            url_for('rest_workspace_map.get',
                    workspace=username,
                    mapname=mapname))
        assert response.status_code == 200
        resp_json = response.get_json()
        thumbnail = resp_json['thumbnail']
        assert 'status' not in thumbnail
        assert 'path' in thumbnail
        assert thumbnail['url'] == url_for_external(
            'rest_workspace_map_thumbnail.get',
            workspace=username,
            mapname=mapname)

    with app.app_context():
        response = client.get(
            url_for('rest_workspace_map_file.get',
                    workspace=username,
                    mapname=mapname))
        assert response.status_code == 200
        resp_json = response.get_json()
        assert resp_json['name'] == mapname

    with app.app_context():
        map_info = client.get(
            url_for('rest_workspace_map.get',
                    workspace=username,
                    mapname=mapname)).get_json()
    while 'status' in map_info['metadata'] and map_info['metadata'][
            'status'] in ['PENDING', 'STARTED']:
        time.sleep(0.1)
        with app.app_context():
            map_info = client.get(
                url_for('rest_workspace_map.get',
                        workspace=username,
                        mapname=mapname)).get_json()

    assert set(map_info['metadata'].keys()) == {
        'identifier', 'csw_url', 'record_url', 'comparison_url'
    }
    assert map_info['metadata']['identifier'] == f"m-{uuid_str}"
    assert map_info['metadata']['csw_url'] == settings.CSW_PROXY_URL
    md_record_url = f"http://micka:80/record/basic/m-{uuid_str}"
    assert map_info['metadata']['record_url'].replace(
        "http://localhost:3080", "http://micka:80") == md_record_url
    response = requests.get(md_record_url, auth=settings.CSW_BASIC_AUTHN)
    response.raise_for_status()
    assert mapname in response.text

    with app.app_context():
        expected_md_values = {
            'abstract':
            "Na tematick\u00e9 map\u011b p\u0159i p\u0159ibl\u00ed\u017een\u00ed jsou postupn\u011b zobrazovan\u00e9 administrativn\u00ed celky Libereck\u00e9ho kraje : okresy, OP\u00da, ORP a obce.",
            'extent': [14.62, 50.58, 15.42, 50.82],
            'graphic_url':
            url_for_external('rest_workspace_map_thumbnail.get',
                             workspace=username,
                             mapname=mapname),
            'identifier': {
                "identifier":
                url_for_external('rest_workspace_map.get',
                                 workspace=username,
                                 mapname=mapname),
                "label":
                "administrativni_cleneni_libereckeho_kraje"
            },
            'map_endpoint':
            url_for_external('rest_workspace_map.get',
                             workspace=username,
                             mapname=mapname),
            'map_file_endpoint':
            url_for_external('rest_workspace_map_file.get',
                             workspace=username,
                             mapname=mapname),
            'operates_on': [],
            'organisation_name':
            None,
            'publication_date':
            TODAY_DATE,
            'reference_system': [3857],
            'revision_date':
            None,
            'title':
            "Administrativn\u00ed \u010dlen\u011bn\u00ed Libereck\u00e9ho kraje",
        }
    check_metadata(client, username, mapname, METADATA_PROPERTIES_EQUAL,
                   expected_md_values)
コード例 #30
0
def test_parse_md_properties():
    xml_path = 'src/layman/map/rest_test_filled_template.xml'
    with open(xml_path, 'r') as xml_file:
        props = common_util.parse_md_properties(xml_file, [
            'abstract',
            'extent',
            'graphic_url',
            'identifier',
            'map_endpoint',
            'map_file_endpoint',
            'md_date_stamp',
            'md_file_identifier',
            'md_organisation_name',
            'organisation_name',
            'publication_date',
            'reference_system',
            'title',
            'operates_on',
        ], METADATA_PROPERTIES)
    with app.app_context():
        expected = {
            'md_file_identifier':
            'm-91147a27-1ff4-4242-ba6d-faffb92224c6',
            'md_organisation_name':
            None,
            'organisation_name':
            None,
            'md_date_stamp':
            '2007-05-25',
            'reference_system': [3857],
            'title':
            'World places and boundaries',
            'publication_date':
            '2007-05-25',
            'identifier': {
                'identifier':
                url_for('rest_workspace_map.get',
                        workspace='testuser1',
                        mapname='svet',
                        internal=False),
                'label':
                'svet',
            },
            'abstract':
            'World places and boundaries abstract',
            'graphic_url':
            url_for('rest_workspace_map_thumbnail.get',
                    workspace='testuser1',
                    mapname='svet',
                    internal=False),
            'extent': [-35, -48.5, 179, 81.5],
            'map_endpoint':
            url_for('rest_workspace_map.get',
                    workspace='testuser1',
                    mapname='svet',
                    internal=False),
            'map_file_endpoint':
            url_for('rest_workspace_map_file.get',
                    workspace='testuser1',
                    mapname='svet',
                    internal=False),
            'operates_on': [
                {
                    'xlink:href':
                    'http://localhost:3080/csw?SERVICE=CSW&VERSION=2.0.2&REQUEST=GetRecordById&OUTPUTSCHEMA=http://www.isotc211.org/2005/gmd&ID=m-39cc8994-adbc-427a-8522-569eb7e691b2#_m-39cc8994-adbc-427a-8522-569eb7e691b2',
                    'xlink:title': 'hranice',
                },
                {
                    'xlink:href':
                    'http://localhost:3080/csw?SERVICE=CSW&VERSION=2.0.2&REQUEST=GetRecordById&OUTPUTSCHEMA=http://www.isotc211.org/2005/gmd&ID=m-fb48a6e3-f36c-43fd-a885-ae7de82b3924#_m-fb48a6e3-f36c-43fd-a885-ae7de82b3924',
                    'xlink:title': 'mista',
                },
            ],
        }
    assert set(props.keys()) == set(expected.keys())
    for k, value in props.items():
        equals_fn = COMMON_PROPERTIES[k].get('equals_fn', None)
        assert prop_equals(
            value, expected[k], equals_fn
        ), f"Values of property {k} do not equal: {value} != {expected[k]}"