def test_get_content_from_another_ecosystem(self): # create new ecosystem ecosysName = "Ecosys_" + utils.generate_random_name() data = {"Name": ecosysName} res = self.call("NewEcosystem", data) self.assertGreater(int(res), 0, "BlockId is not generated: " + str(res)) ecosysNum = funcs.call_get_api(url + "/ecosystems/", "", token)["number"] # login founder in new ecosystem data2 = utils.login(url, prKey, 0, ecosysNum) token2 = data2["jwtToken"] # create page in new ecosystem pageName = "Page_" + utils.generate_random_name() pageText = "Page in " + str(ecosysNum) + " ecosystem" pageValue = "Span(" + pageText + ")" data = { "Name": pageName, "Value": pageValue, "ApplicationId": 1, "Conditions": "true", "Menu": "default_menu" } resp = utils.call_contract(url, prKey, "@1NewPage", data, token2) status = utils.txstatus(url, pause, resp["hash"], token2) self.assertGreater(int(status["blockid"]), 0, "BlockId is not generated: " + str(status)) # create menu in new ecosystem menuName = "Menu_" + utils.generate_random_name() menuTitle = "Test menu" data = { "Name": menuName, "Value": "MenuItem(Title:\"" + menuTitle + "\")", "ApplicationId": 1, "Conditions": "true" } resp = utils.call_contract(url, prKey, "@1NewMenu", data, token2) status = utils.txstatus(url, pause, resp["hash"], token2) self.assertGreater(int(status["blockid"]), 0, "BlockId is not generated: " + str(status)) # test data = "" asserts = ["tree"] resPage = self.check_post_api( "/content/page/@" + str(ecosysNum) + pageName, data, asserts) resMenu = self.check_post_api( "/content/menu/@" + str(ecosysNum) + menuName, data, asserts) mustBe = dict(pageText=pageText, menu=menuTitle) expectedValue = dict( pageText=resPage["tree"][0]["children"][0]["text"], menu=resMenu["tree"][0]["attr"]["title"]) self.assertEqual(mustBe, expectedValue, "Dictionaries are different!")
def impApp(appName, url, prKey, token): path = os.path.join(os.getcwd(), "fixtures", "basic", appName + ".json") with open(path, 'r', encoding="utf8") as f: file = f.read() files = {'input_file': file} resp = utils.call_contract_with_files(url, prKey, "ImportUpload", {}, files, token) if ("hash" in resp): resImportUpload = utils.txstatus(url, 30, resp["hash"], token) if int(resImportUpload["blockid"]) > 0: founderID = funcs.call_get_api( url + "/ecosystemparam/founder_account/", "", token)['value'] result = funcs.call_get_api(url + "/list/buffer_data", "", token) buferDataList = result['list'] for item in buferDataList: if item['key'] == "import" and item['member_id'] == founderID: importAppData = json.loads(item['value'])['data'] break contractName = "Import" data = [{ "contract": contractName, "params": importAppData[i] } for i in range(len(importAppData))] resp = utils.call_multi_contract(url, prKey, contractName, data, token) time.sleep(30) if "hashes" in resp: hashes = resp['hashes'] result = utils.txstatus_multi(url, 30, hashes, token) for status in result.values(): print(status) if int(status["blockid"]) < 1: print("Import is failed") exit(1) print("App '" + appName + "' successfully installed")
def is_node_owner_true(self): data = {} resp = utils.call_contract(url, prKey, "NodeOwnerCondition", data, token) status = utils.txstatus(url, pause, resp["hash"], token) self.assertGreater(int(status["blockid"]), 0, "BlockId is not generated: " + str(status))
def assertTxInBlock(self, result, jwtToken): self.assertIn("hash", result) status = utils.txstatus(url, self.config["1"]["time_wait_tx_in_block"], result['hash'], jwtToken) print(status) self.assertNotIn(json.dumps(status), 'errmsg') self.assertGreater(len(status['blockid']), 0)
def test_money_transfer(self): balanceNodeOwnerB = utils.get_balance_from_db(conf["1"]["dbHost"], conf["1"]["dbName"], conf["1"]["login"], conf["1"]["pass"], conf["2"]["keyID"]) commisionWallet = utils.get_commission_wallet(conf["1"]["dbHost"], conf["1"]["dbName"], conf["1"]["login"], conf["1"]["pass"], 1) balanceCommisionB = utils.get_balance_from_db(conf["1"]["dbHost"], conf["1"]["dbName"], conf["1"]["login"], conf["1"]["pass"], commisionWallet) tokenRunner, uid = utils.get_uid(conf["2"]["url"]) signature = sign(keys["key2"], uid) pubRunner = get_public_key(keys["key2"]) balanceRunnerB = utils.get_balance_from_db_by_pub( conf["1"]["dbHost"], conf["1"]["dbName"], conf["1"]["login"], conf["1"]["pass"], pubRunner) dataRunner = utils.login(conf["2"]["url"], keys["key2"], 0) tokenRunner = dataRunner["jwtToken"] data = {"Recipient": "0005-2070-2000-0006-0200", "Amount": "1000"} res = utils.call_contract(conf["2"]["url"], keys["key2"], "MoneyTransfer", data, tokenRunner) hash = res["hash"] result = utils.txstatus(conf["2"]["url"], conf["2"]["time_wait_tx_in_block"], hash, tokenRunner) balanceRunnerMust = balanceRunnerB - 1000 balanceRunnerB = utils.get_balance_from_db_by_pub( conf["1"]["dbHost"], conf["1"]["dbName"], conf["1"]["login"], conf["1"]["pass"], pubRunner)
def call(self, name, data): url = self.config["2"]["url"] prKey = self.config["1"]['private_key'] token = self.data["jwtToken"] result = utils.call_contract(url, prKey, name, data, token) status = utils.txstatus(url, self.config["1"]["time_wait_tx_in_block"], result['hash'], token) return status
def assertTxInBlock(self, result, jwtToken): self.assertIn("hash", result) hash = result['hash'] status = utils.txstatus(url, pause, hash, jwtToken) if len(status['blockid']) > 0: self.assertNotIn(json.dumps(status), 'errmsg') return status["blockid"] else: return status["errmsg"]["error"]
def isInBlock(call, url, token): if "hash" in call: status = utils.txstatus(url, 30, call["hash"], token) print(status) if "blockid" not in status or int(status["blockid"]) < 0: print(status) return False else: return False return True
def check_contract_with_data(self, sourse, data, checkPoint): code, name = self.generate_name_and_code(sourse) self.create_contract(code) url = self.config["2"]["url"] prKey = self.config["1"]['private_key'] token = self.data["jwtToken"] sleep = self.config["1"]["time_wait_tx_in_block"] res = utils.call_contract(url, prKey, name, data, token) hash = res["hash"] result = utils.txstatus(url, sleep, hash, token) self.assertIn(checkPoint, result["result"], "error")
def test_sys_var_role_id_readonly(self): sysVarName = "$role_id" contracName = utils.generate_random_name() value = "contract con_" + contracName + " { data{ } conditions{ } action{ " + sysVarName + " = 5 } }" data = {"Value": value, "ApplicationId": 1, "Conditions": "true"} result = utils.call_contract(url, prKey, "NewContract", data, token) tx = utils.txstatus(url, self.config["1"]["time_wait_tx_in_block"], result['hash'], token) expResult = "system variable " + sysVarName + " cannot be changed" msg = "system variable " + sysVarName + " was been changed!" self.assertEqual(tx["errmsg"]["error"], expResult, msg)
def test_contract_langRes(self): data = { "ApplicationId": 1, "Name": "test", "Trans": "{\"en\": \"test_en\", \"de\" : \"test_de\"}" } result = utils.call_contract(url, prKey, "NewLang", data, token) tx = utils.txstatus(url, self.config["1"]["time_wait_tx_in_block"], result['hash'], token) contract = self.contracts["langRes"] self.check_contract(contract["code"], contract["asert"])
def is_node_owner_false(self): keys = config.getKeys() prKey2 = keys["key1"] data2 = utils.login(url, prKey2, 0) token2 = data2["jwtToken"] data = {} resp = utils.call_contract(url, prKey2, "NodeOwnerCondition", data, token2) status = utils.txstatus(url, pause, resp["hash"], token2) self.assertEqual(status["errmsg"]["error"], "Sorry, you do not have access to this action.", "Incorrect message: " + str(status))
def addBinary(self): name = "image_" + utils.generate_random_name() path = os.path.join(os.getcwd(), "fixtures", "image2.jpg") with open(path, 'rb') as f: file = f.read() files = {'Data': file} data = {"Name": name, "ApplicationId": 1} resp = utils.call_contract_with_files(url, prKey, "UploadBinary", data, files, token) res = utils.txstatus(url, waitTx, resp['hash'], token) self.assertGreater(int(res['blockid']), 0, "BlockId is not generated: " + str(res))
def deactivateContract(self): dataCreater = utils.login(conf["1"]["url"], conf["1"]["private_key"], 0) tokenCreater = dataCreater["jwtToken"] id = funcs.get_contract_id(conf["1"]["url"], "CostContract", tokenCreater) data = {"Id": id} result = utils.call_contract(conf["1"]["url"], conf["1"]["private_key"], "DeactivateContract", data, tokenCreater) status = utils.txstatus(conf["1"]["url"], conf["1"]["time_wait_tx_in_block"], result['hash'], tokenCreater)
def test_contract_dbInsert(self): columns = """[{"name":"name","type":"varchar", "index": "1", "conditions":"true"}, {"name":"test","type":"varchar", "index": "0", "conditions":"true"}]""" permission = """{"insert": "true", "update" : "true","new_column": "true"}""" data = { "Name": "test", "ApplicationId": 1, "Columns": columns, "Permissions": permission } result = utils.call_contract(url, prKey, "NewTable", data, token) tx = utils.txstatus(url, self.config["1"]["time_wait_tx_in_block"], result['hash'], token) contract = self.contracts["dbInsert"] self.check_contract(contract["code"], contract["asert"])
def test_z1_dbSelectMetricsMin(self): # func generate contract which return block_id and increment count blocks def waitBlockId(old_block_id, limit): while True: if old_block_id == limit: break contracName = utils.generate_random_name() value = "contract con_" + contracName + " {\n data{} \n conditions{} \n action { \n $result = $block \n } \n }" data = { "Value": value, "ApplicationId": 1, "Conditions": "true" } result = utils.call_contract(url, prKey, "NewContract", data, token) tx = utils.txstatus(url, self.config["1"]["time_wait_tx_in_block"], result['hash'], token) current_block_id = int(tx["blockid"]) self.assertGreater(current_block_id, 0, "BlockId is not generated: " + str(tx)) old_block_id = current_block_id # generate contract which return count blocks in blockchain contracName = utils.generate_random_name() value = "contract con_" + contracName + " {\n data{} \n conditions{} \n action { \n $result = $block \n } \n }" data = {"Value": value, "ApplicationId": 1, "Conditions": "true"} result = utils.call_contract(url, prKey, "NewContract", data, token) tx = utils.txstatus(url, self.config["1"]["time_wait_tx_in_block"], result['hash'], token) current_block_id = int(tx["blockid"]) self.assertGreater(current_block_id, 0, "BlockId is not generated: " + str(tx)) # wait until generated 100 blocks if current_block_id < 100: waitBlockId(current_block_id, 100) # wait until generated multiples of 100 blocks if (current_block_id % 100 >= 90): count = current_block_id + (100 - (current_block_id % 100)) waitBlockId(current_block_id, count) # test ecosystem_tx = self.getMetrics(1, "ecosystem_tx") contract = self.contracts["dbSelectMetricsMin"] self.check_contract(contract["code"], str(ecosystem_tx))
def createContracts(self): global dataCreater dataCreater = utils.login(conf["1"]["url"], conf["1"]["private_key"], 0) tokenCreater = dataCreater["jwtToken"] contract = config.readFixtures("contracts") code = "contract CostContract" + contract["for_cost"]["code"] data = { "Wallet": "", "Value": code, "ApplicationId": 1, "Conditions": "true" } result = utils.call_contract(conf["1"]["url"], conf["1"]["private_key"], "NewContract", data, tokenCreater) status = utils.txstatus(conf["1"]["url"], conf["1"]["time_wait_tx_in_block"], result['hash'], tokenCreater) print(status)
def waitBlockId(old_block_id, limit): while True: if old_block_id == limit: break contracName = utils.generate_random_name() value = "contract con_" + contracName + " {\n data{} \n conditions{} \n action { \n $result = $block \n } \n }" data = { "Value": value, "ApplicationId": 1, "Conditions": "true" } result = utils.call_contract(url, prKey, "NewContract", data, token) tx = utils.txstatus(url, self.config["1"]["time_wait_tx_in_block"], result['hash'], token) current_block_id = int(tx["blockid"]) self.assertGreater(current_block_id, 0, "BlockId is not generated: " + str(tx)) old_block_id = current_block_id
def call(self, name, data): resp = utils.call_contract(url, prKey, name, data, token) res = utils.txstatus(url, waitTx, resp['hash'], token) return res
def test_deactive_contract_with_err(self): if funcs.is_contract_activated(conf["2"]["url"], "CostContract", self.token) == True: self.deactivateContract() walletId = funcs.get_activated_wallet(conf["2"]["url"], "CostContract", self.token) balanceContractOwnerB = utils.get_balance_from_db( conf["1"]["dbHost"], conf["1"]["dbName"], conf["1"]["login"], conf["1"]["pass"], walletId) balanceNodeOwnerB = utils.get_balance_from_db(conf["1"]["dbHost"], conf["1"]["dbName"], conf["1"]["login"], conf["1"]["pass"], conf["2"]["keyID"]) commisionWallet = utils.get_commission_wallet(conf["1"]["dbHost"], conf["1"]["dbName"], conf["1"]["login"], conf["1"]["pass"], 1) balanceCommisionB = utils.get_balance_from_db(conf["1"]["dbHost"], conf["1"]["dbName"], conf["1"]["login"], conf["1"]["pass"], commisionWallet) commission = utils.get_system_parameter(conf["1"]["dbHost"], conf["1"]["dbName"], conf["1"]["login"], conf["1"]["pass"], "commission_size") tokenRunner, uid = utils.get_uid(conf["2"]["url"]) signature = sign(keys["key2"], uid) pubRunner = get_public_key(keys["key2"]) balanceRunnerB = utils.get_balance_from_db_by_pub( conf["1"]["dbHost"], conf["1"]["dbName"], conf["1"]["login"], conf["1"]["pass"], pubRunner) dataRunner = utils.login(conf["2"]["url"], keys["key2"], 0) tokenRunner = dataRunner["jwtToken"] res = utils.call_contract(conf["2"]["url"], keys["key2"], "CostContract", {"State": 0}, tokenRunner) time.sleep(10) hash = res["hash"] result = utils.txstatus(conf["2"]["url"], conf["2"]["time_wait_tx_in_block"], hash, tokenRunner) balanceContractOwnerA = utils.get_balance_from_db( conf["1"]["dbHost"], conf["1"]["dbName"], conf["1"]["login"], conf["1"]["pass"], walletId) balanceNodeOwnerA = utils.get_balance_from_db(conf["1"]["dbHost"], conf["1"]["dbName"], conf["1"]["login"], conf["1"]["pass"], conf["2"]["keyID"]) balanceCommisionA = utils.get_balance_from_db(conf["1"]["dbHost"], conf["1"]["dbName"], conf["1"]["login"], conf["1"]["pass"], commisionWallet) balanceRunnerA = utils.get_balance_from_db_by_pub( conf["1"]["dbHost"], conf["1"]["dbName"], conf["1"]["login"], conf["1"]["pass"], pubRunner) dictValid = dict(balanceContractOwner=balanceContractOwnerA, balanceNodeOwner=balanceNodeOwnerA, balanceCommision=balanceCommisionA, balanceRunner=balanceRunnerA) dictExpect = dict(balanceContractOwner=balanceContractOwnerB, balanceNodeOwner=balanceNodeOwnerB, balanceCommision=balanceCommisionB, balanceRunner=balanceRunnerB) msg = "balanceContractOwnerA:" + str(balanceContractOwnerA) + "\n" +\ "balanceContractOwnerE:" + str(balanceContractOwnerB) + "\n" +\ "balanceNodeOwnerA:" + str(balanceNodeOwnerA) + "\n" +\ "balanceNodeOwnerE:" + str(balanceNodeOwnerB) + "\n" +\ "balanceCommisionA:" + str(balanceCommisionA) + "\n" +\ "balanceCommisionE:" + str(balanceCommisionB) + "\n" +\ "balanceRunnerA:" + str(balanceRunnerA) + "\n" +\ "balanceRunnerE:" + str(balanceRunnerB) + "\n" self.assertDictEqual(dictValid, dictExpect, msg)
def test_deactive_contract(self): if funcs.is_contract_activated(conf["2"]["url"], "CostContract", self.token) == True: self.deactivateContract() walletId = funcs.get_activated_wallet(conf["2"]["url"], "CostContract", self.token) sumsBefore = utils.getUserTokenAmounts(conf["1"]["dbHost"], conf["1"]["dbName"], conf["1"]["login"], conf["1"]["pass"]) summBefore = sum(summ[0] for summ in sumsBefore) bNodeBalance = self.getNodeBalances() tokenRunner, uid = utils.get_uid(conf["2"]["url"]) signature = sign(keys["key2"], uid) pubRunner = get_public_key(keys["key2"]) balanceRunnerB = utils.get_balance_from_db_by_pub( conf["1"]["dbHost"], conf["1"]["dbName"], conf["1"]["login"], conf["1"]["pass"], pubRunner) dataRunner = utils.login(conf["2"]["url"], keys["key2"], 0) tokenRunner = dataRunner["jwtToken"] res = utils.call_contract(conf["2"]["url"], keys["key2"], "CostContract", {"State": 1}, tokenRunner) result = utils.txstatus(conf["2"]["url"], conf["2"]["time_wait_tx_in_block"], res["hash"], tokenRunner) time.sleep(10) node = utils.get_block_gen_node(conf["1"]["dbHost"], conf["1"]["dbName"], conf["1"]["login"], conf["1"]["pass"], result["blockid"]) sumsAfter = utils.getUserTokenAmounts(conf["1"]["dbHost"], conf["1"]["dbName"], conf["1"]["login"], conf["1"]["pass"]) summAfter = sum(summ[0] for summ in sumsAfter) aNodeBalance = self.getNodeBalances() nodeCommission = 141620000000000000 platformaCommission = 4380000000000000 commission = nodeCommission + platformaCommission balanceRunnerA = utils.get_balance_from_db_by_pub( conf["1"]["dbHost"], conf["1"]["dbName"], conf["1"]["login"], conf["1"]["pass"], pubRunner) balanceContractOwnerA = utils.get_balance_from_db( conf["1"]["dbHost"], conf["1"]["dbName"], conf["1"]["login"], conf["1"]["pass"], walletId) inHistory = self.isCommissionsInHistory(nodeCommission, dataRunner["key_id"], platformaCommission, node) if node == 0: dictValid = dict(balanceRunner=balanceRunnerA, platformBalance=aNodeBalance[0], summ=summBefore, history=inHistory) dictExpect = dict(balanceRunner=balanceRunnerB - commission, platformBalance=bNodeBalance[0] + commission, summ=summAfter, history=True) else: dictValid = dict(balanceRunner=balanceRunnerA, platformBalance=aNodeBalance[0], nodeBalance=aNodeBalance[node], summ=summBefore, history=inHistory) dictExpect = dict(balanceRunner=balanceRunnerB - commission, platformBalance=bNodeBalance[0] + platformaCommission, nodeBalance=bNodeBalance[node] + nodeCommission, summ=summAfter, history=True) self.assertDictEqual(dictValid, dictExpect, "Error in comissions run deactivated contract")