예제 #1
0
 def setUp(self):
     self.oauth_token = OAUTH_TOKEN
     self.oauth_token_secret = OAUTH_TOKEN_SECRET
     self.api_base = DEV_OSM_API_URL
     self.app_id = 'healthsites.testcase'
     self.api = OsmApiWrapper(
         client_key=SOCIAL_AUTH_OPENSTREETMAP_KEY,
         client_secret=SOCIAL_AUTH_OPENSTREETMAP_SECRET,
         oauth_token=self.oauth_token,
         oauth_token_secret=self.oauth_token_secret,
         api=self.api_base,
         appid=self.app_id)
     self.maxDiff = None
     print(self._testMethodName)
     print(self.api)
예제 #2
0
파일: utils.py 프로젝트: tyrasd/healthsites
def update_osm_node(user, data):
    """Update OSM node data and push it to master OSM instance through OSM api.

    :param user: The user.
    :type user: django.contrib.auth.models.User

    :param data: OSM Node data.
    :type data: dict
        example: {
            'id': id of node,
            'lat': latitude of node,
            'lon': longitude of node,
            'tag': {},
            'version': version number of node,
        }

    :return: OSM changeset data.
    :rtype: dict
        example: {
            'id': id of node,
            'lat': latitude of node,
            'lon': longitude of node,
            'tag': dict of tags,
            'changeset': id of changeset of last change,
            'version': version number of node,
            'user': username of last change,
            'uid': id of user of last change,
            'visible': True|False
        }
    """
    oauth_token, oauth_token_secret = get_oauth_token(user)
    osm_api = OsmApiWrapper(
        client_key=settings.SOCIAL_AUTH_OPENSTREETMAP_KEY,
        client_secret=settings.SOCIAL_AUTH_OPENSTREETMAP_SECRET,
        oauth_token=oauth_token,
        oauth_token_secret=oauth_token_secret,
        api=settings.OSM_API_URL,
        appid=settings.APP_NAME)
    response = osm_api.update_node(data, data.get('comment', None),
                                   data.get('source', None))

    return response
예제 #3
0
class TestOsmApi(unittest.TestCase):
    def setUp(self):
        self.oauth_token = OAUTH_TOKEN
        self.oauth_token_secret = OAUTH_TOKEN_SECRET
        self.api_base = DEV_OSM_API_URL
        self.app_id = 'healthsites.testcase'
        self.api = OsmApiWrapper(
            client_key=SOCIAL_AUTH_OPENSTREETMAP_KEY,
            client_secret=SOCIAL_AUTH_OPENSTREETMAP_SECRET,
            oauth_token=self.oauth_token,
            oauth_token_secret=self.oauth_token_secret,
            api=self.api_base,
            appid=self.app_id)
        self.maxDiff = None
        print(self._testMethodName)
        print(self.api)

    def _session_mock(self,
                      auth=False,
                      filenames=None,
                      status=200,
                      reason=None):
        if auth:
            self.api._oauth_token = self.oauth_token
            self.api._oauth_token_secret = self.oauth_token_secret

        response_mock = mock.Mock()
        response_mock.status_code = status
        return_values = self._return_values(filenames)
        print(filenames)
        print(return_values)
        assert len(return_values) < 2
        if return_values:
            response_mock.content = return_values[0]

        session_mock = mock.Mock()
        session_mock.request = mock.Mock(return_value=response_mock)

        self.api._get_http_session = mock.Mock(return_value=session_mock)
        self.api._session = session_mock

        self.api._sleep = mock.Mock()

    def _return_values(self, filenames):
        if filenames is None:
            filenames = [self._testMethodName + '.xml']

        return_values = []
        for filename in filenames:
            path = os.path.join(__location__, 'fixtures', filename)
            try:
                with open(path) as file:
                    return_values.append(file.read())
            except Exception:
                pass
        return return_values

    def teardown(self):
        pass

    def test_constructor(self):
        self.assertTrue(isinstance(self.api, OsmApiWrapper))

    def test_NodeGet(self):
        self._session_mock()

        result = self.api.NodeGet(123)

        args, kwargs = self.api._session.request.call_args
        self.assertEquals(args[0], 'GET')
        self.assertEquals(args[1], self.api_base + '/api/0.6/node/123')

        self.assertEquals(
            result, {
                'id': 123,
                'changeset': 15293,
                'uid': 605,
                'timestamp': datetime.datetime(2012, 4, 18, 11, 14, 26),
                'lat': 51.8753146,
                'lon': -1.4857118,
                'visible': True,
                'version': 8,
                'user': '******',
                'tag': {
                    'amenity': 'school',
                    'foo': 'bar',
                    'name': 'Berolina & Schule'
                },
            })

    def test_NodeCreate(self):
        self._session_mock(auth=True)

        # setup mock
        self.api.ChangesetCreate = mock.Mock(return_value=1111)
        self.api._CurrentChangesetId = 1111

        test_node = {
            'lat': 47.287,
            'lon': 8.765,
            'tag': {
                'amenity': 'place_of_worship',
                'religion': 'pastafarian'
            }
        }

        cs = self.api.ChangesetCreate({'comment': 'This is a test dataset'})
        self.assertEquals(cs, 1111)
        result = self.api.NodeCreate(test_node)

        args, kwargs = self.api._session.request.call_args
        self.assertEquals(args[0], 'PUT')
        self.assertEquals(args[1], self.api_base + '/api/0.6/node/create')

        self.assertEquals(result['id'], 9876)
        self.assertEquals(result['lat'], test_node['lat'])
        self.assertEquals(result['lon'], test_node['lon'])
        self.assertEquals(result['tag'], test_node['tag'])

    @unittest.skipIf(condition=not (OAUTH_TOKEN and OAUTH_TOKEN_SECRET),
                     reason='requires valid oauth token')
    def test_crud_osm_node(self):
        test_node = {
            'lat': 47.287,
            'lon': 8.765,
            'tag': {
                'amenity': 'place_of_worship',
                'religion': 'pastafarian'
            }
        }

        # Creating osm node using osm api client.
        result = self.api.create_node(test_node)
        node_id = result.get('id')
        node_version = result.get('version')
        self.assertIsNotNone(node_id)
        self.assertEqual(1, node_version)

        # Read osm node using osm api client and check whether newly created
        # osm node is exist in the osm instance.
        result = self.api.NodeGet(node_id)
        self.assertEqual(node_id, result.get('id'))

        # Update/modify an osm node data using osm api client.
        test_node['id'] = node_id
        test_node['tag']['name'] = 'pastafarian church'
        result = self.api.update_node(test_node)
        node_name = result.get('tag', {}).get('name')
        self.assertEqual(node_id, result.get('id'))
        self.assertEqual(node_name, 'pastafarian church')

        # Read osm node using osm api client and check whether newly updated
        # osm node is exist. Latest version number should be increased.
        result = self.api.NodeGet(node_id)
        node_version = result.get('version')
        self.assertEqual(node_id, result.get('id'))
        self.assertEqual(2, node_version)

        # Delete the latest version of an osm node using osm api client.
        test_node['version'] = 2
        _ = self.api.delete_node(test_node)

        # Read osm node using osm api client and check if it raises
        # ElementDeletedApiError since the osm node has been deleted.
        self.assertRaises(ElementDeletedApiError, self.api.delete_node,
                          test_node)