def test_init(self): """正常に初期化できること""" param = self.get_sample_param() service = baas.Service(param) assert service.param == param assert service.param["baseUrl"] == "http://localhost/api" assert service.session_token is None
def test_execute_rest(self, mock): """正常に REST API を呼び出せること""" service = baas.Service(self.get_sample_param()) service.session_token = "token1" query = {"a": 1} mock.return_value = {} ret = service.execute_rest("GET", "a/b/c", query=query) assert ret == {} method = mock.call_args[0][0] kwargs = mock.call_args[1] assert method == "GET" assert kwargs["url"] == "http://localhost/api/1/tenant1/a/b/c" assert kwargs["params"] == query headers = kwargs["headers"] assert headers["X-Application-Id"] == "app1" assert headers["X-Application-Key"] == "key1" assert headers["X-Session-Token"] == "token1" # timeout は含まれない assert "timeout" not in kwargs
def test_verify_session_token(self): """正常にセッショントークンが検証できること""" service = baas.Service(self.get_sample_param()) service.session_token = "testToken" service.session_token_expire = time.time() + 1 service.verify_session_token()
def get_service(self): param = { "baseUrl": "http://localhost/api", "tenantId": "tenant1", "appId": "app1", "appKey": "key1" } return baas.Service(param)
def _test_load_session_token_file_invalid(self, mock_path, session_token): mock_path.exists.return_value = True service = baas.Service(self.get_sample_param()) with patch(builtin + ".open", mock_open(read_data=session_token)): with pytest.raises(Exception): service.load_session_token()
def test_verify_session_token_expired(self): """正常にセッショントークンが期限切れの場合は例外が raise されること""" service = baas.Service(self.get_sample_param()) service.session_token = "testToken" service.session_token_expire = time.time() with pytest.raises(Exception): service.verify_session_token()
def test_save_session_token_without_token(self, mock_path): """セッショントークンがない場合はエラーとなること""" mock_path.exists.return_value = True service = baas.Service(self.get_sample_param()) service.session_token = None service.session_token_expire = None with pytest.raises(Exception): service.save_session_token()
def test_load_session_token_file_not_exists(self, mock_path): """セッショントークンファイルがない場合はセッショントークンをクリアすること""" mock_path.exists.return_value = False service = baas.Service(self.get_sample_param()) service.session_token = "testToken" service.session_token_expire = 1534847297 service.load_session_token() assert service.session_token is None assert service.session_token_expire is None
def test_execute_rest_with_headers(self, mock): """ヘッダ付きで正常に REST API を呼び出せること""" service = baas.Service(self.get_sample_param()) mock.return_value = {} ret = service.execute_rest("GET", "a/b/c", headers={"X-header1": "xxx"}) assert ret == {} headers = mock.call_args[1]["headers"] assert headers["X-header1"] == "xxx"
def test_execute_rest_jp(self, mock): """正常に日本語ありの URL で REST API を呼び出せること""" param = self.get_sample_param() param["baseUrl"] = u"http://ホスト名/api" service = baas.Service(param) mock.return_value = {} ret = service.execute_rest("GET", "a/b/c") assert ret == {} kwargs = mock.call_args[1] assert kwargs["url"] == "http://ホスト名/api/1/tenant1/a/b/c"
def test_execute_rest_with_timeout(self, mock): """正常にタイムアウト付きで REST API を呼び出せること""" baas.Service.set_default_timeout(10) service = baas.Service(self.get_sample_param()) mock.return_value = {} ret = service.execute_rest("GET", "a/b/c") assert ret == {} timeout = mock.call_args[1]["timeout"] assert timeout is 10
def test_load_session_token(self, mock_path): """正常にセッショントークンが load できること""" mock_path.exists.return_value = True session_token = '{"sessionTokenExpire": 1534847297, "sessionToken": "testToken"}' service = baas.Service(self.get_sample_param()) with patch(builtin + ".open", mock_open(read_data=session_token)): service.load_session_token() assert service.session_token == "testToken" assert service.session_token_expire == 1534847297
def test_init_file_not_found(self): """設定ファイルが存在しない場合はエラーとなること""" m = mock_open() with patch("io.open", m) as mocked_open: mocked_open.side_effect = IOError() with pytest.raises(Exception): baas.Service() args_list = m.call_args_list assert args_list[0][0][0] == os.path.expanduser( "~/.baas/python/python_config.yaml") assert args_list[1][0][0] == "/etc/baas/python/python_config.yaml"
def test_init_home_file(self): """ホームディレクトリの設定ファイルでサービス初期化すること""" # ファイルが存在しない場合はエラー with pytest.raises(Exception): baas.Service() # パラメータ指定で初期化 c = util.load_config() param = c["service"] service = baas.Service(param) # ファイル保存 service.save_config( os.path.expanduser("~/.baas/python/python_config.yaml")) # 設定ファイルで初期化 service2 = baas.Service(param) assert service2.param == param param2 = { "baseUrl": "http://テストホスト/api", "tenantId": "tenant1", "appId": "app1", "appKey": "key1", "proxy": { "http": "proxy.example.com:8080", "https": "proxy.example2.com:8080" } } service3 = baas.Service(param2) # ファイル上書き保存 service3.save_config( os.path.expanduser("~/.baas/python/python_config.yaml")) # 設定ファイルで初期化 service4 = baas.Service() assert service4.param == param2
def test_execute_rest_with_json(self, mock): """JSONボディ付きで正常に REST API を呼び出せること""" service = baas.Service(self.get_sample_param()) mock.return_value = {} service.execute_rest("POST", "a/b/c", json={"a": 1}) kwargs = mock.call_args[1] assert kwargs["json"] == {"a": 1} # json 指定時は Content-Type ヘッダなし (requests 側で自動設定) headers = kwargs["headers"] assert "Content-Type" not in headers
def test_execute_rest_with_data(self, mock): """data付きで正常に REST API を呼び出せること""" service = baas.Service(self.get_sample_param()) mock.return_value = {} service.execute_rest("POST", "a/b/c", data="xxxxx") kwargs = mock.call_args[1] assert kwargs["data"] == "xxxxx" # data 指定時は Content-Type デフォルトは application/octet-stream headers = kwargs["headers"] assert headers["Content-Type"] == "application/octet-stream"
def test_save_config(self): """正常に設定情報を保存できること""" param = self.get_sample_param() service = baas.Service(param) path = "/tmp/config.yaml" m = mock_open() with patch("io.open", m, create=True): service.save_config(path) m.assert_called_with(path, 'w', encoding='utf-8') write_data = self._get_write_data(m) assert param == yaml.load(write_data)
def create_service(master=False, key="service"): """ Create service from config file. Args: master (bool): use master key key (str): service key in config Returns: Service: service" """ c = load_config() param = c[key] if master: param["appKey"] = param["masterKey"] return baas.Service(param)
def test_init_with_file(self): """ファイルを使用して正常に初期化できること""" config_file = "baseUrl: http://localhost/api\n" \ "tenantId: tenant1\n" \ "appId: app1\n" \ "appKey: key1\n" \ "proxy:\n" \ " http: proxy.example.com:8080\n" \ " https: proxy.example2.com:8080\n" with patch("io.open", mock_open(read_data=config_file)): service = baas.Service() assert service.param["baseUrl"] == "http://localhost/api" assert service.param["tenantId"] == "tenant1" assert service.param["appId"] == "app1" assert service.param["appKey"] == "key1" proxy = service.param["proxy"] assert proxy["http"] == "proxy.example.com:8080" assert proxy["https"] == "proxy.example2.com:8080"
def test_save_session_token(self, mock_mkdirs, mock_path): """正常にセッショントークンが save できること""" mock_path.exists.return_value = False session_token = { "sessionToken": "testToken", "sessionTokenExpire": 1534847297 } expected_token = json.dumps(session_token) service = baas.Service(self.get_sample_param()) service.session_token = "testToken" service.session_token_expire = 1534847297 m = mock_open() with patch(builtin + ".open", m, create=True): service.save_session_token() m.assert_called_with(baas.Service._SESSION_TOKEN_FILE_PATH, 'w') assert self._get_write_data(m) == expected_token mock_mkdirs.assert_called_once()
#!/usr/bin/env python # -*- coding: utf-8 -*- import os import sys sys.path.append( os.path.abspath(os.path.dirname(os.path.abspath(__file__)) + "/../")) import necbaas as baas from config import CONFIG service = baas.Service(CONFIG) # login test res = baas.User.login(service, username="******", password="******") print("login result:", res) print() # object bucket objectBucket = baas.ObjectBucket(service, "test2") obj = objectBucket.insert({"score": 90}) print("insert:", obj) obj["score"] = 95 res = objectBucket.update(obj["_id"], obj, obj["etag"]) print("update:", res) res = objectBucket.query(where={}) print("query:", res)
def test_execute_rest_invalid_method(self): """不正なメソッドはエラーとなること""" service = baas.Service(self.get_sample_param()) with pytest.raises(Exception): service.execute_rest("PATCH", "/a/b/c")
def test_verify_session_token_no_token(self): """正常にセッショントークンがない場合は例外が raise されること""" service = baas.Service(self.get_sample_param()) with pytest.raises(Exception): service.verify_session_token()
def test_init_normalize_base_url(self): """baseUrl が正常に正規化されること""" param = self.get_sample_param() param["baseUrl"] = "http://localhost/api/" # trailing slash service = baas.Service(param) assert service.param["baseUrl"] == "http://localhost/api"
def test_init_base_url_jp(self, base_url): """日本語 baseUrl が正常に初期化されること""" param = self.get_sample_param() param["baseUrl"] = base_url service = baas.Service(param) assert service.param["baseUrl"] == u"http://ホスト名/api"
def _test_init_bad_sub(self, key): param = self.get_sample_param() del param[key] with pytest.raises(ValueError): baas.Service(param)