def test_get_deploy_info(self):
        context = Mock(spec=IconScoreContext)

        score_address = create_address(1)
        self.storage._create_db_key = Mock(
            return_value=score_address.to_bytes())
        self.storage._db.get = Mock(return_value=None)
        self.assertEqual(None,
                         self.storage.get_deploy_info(context, score_address))

        score_address = create_address(1)
        deploy_info = IconScoreDeployInfo(score_address, DeployState.INACTIVE,
                                          create_address(), ZERO_TX_HASH,
                                          create_tx_hash())
        self.storage._create_db_key = Mock(
            return_value=score_address.to_bytes())
        self.storage._db.get = Mock(return_value=deploy_info.to_bytes())
        self.assertEqual(
            deploy_info.to_bytes(),
            self.storage.get_deploy_info(context, score_address).to_bytes())
    def test_put_deploy_info(self):
        context = Mock(spec=IconScoreContext)
        score_address = create_address(1)
        deploy_info = IconScoreDeployInfo(score_address, DeployState.INACTIVE,
                                          create_address(), ZERO_TX_HASH,
                                          create_tx_hash())
        self.storage._create_db_key = Mock(
            return_value=score_address.to_bytes())
        self.storage._db.put = Mock()

        self.storage.put_deploy_info(context, deploy_info)
        self.storage._db.put.assert_called_once_with(context,
                                                     score_address.to_bytes(),
                                                     deploy_info.to_bytes())
    def test_deploy_info_from_bytes_to_bytes_none_check(self):
        score_address = create_address(1)
        owner_address = create_address()
        tx_hash1 = create_tx_hash()
        tx_hash2 = ZERO_TX_HASH
        deploy_state = DeployState.INACTIVE

        info1 = IconScoreDeployInfo(score_address, deploy_state, owner_address,
                                    tx_hash1, tx_hash2)

        data = IconScoreDeployInfo.to_bytes(info1)
        self.assertTrue(isinstance(data, bytes))

        info2 = IconScoreDeployInfo.from_bytes(data)
        self.assertEqual(info2.score_address, score_address)
        self.assertEqual(info2.deploy_state, deploy_state)
        self.assertEqual(info2.owner, owner_address)
        self.assertEqual(info2.current_tx_hash, tx_hash1)
        self.assertEqual(info2.next_tx_hash, tx_hash2)
    def test_update_score_info(self):
        context = Mock(spec=IconScoreContext)
        score_address = create_address(1)
        tx_hash = create_tx_hash()

        self.storage.get_deploy_info = Mock(return_value=None)
        with self.assertRaises(InvalidParamsException) as e:
            self.storage.update_score_info(context, score_address, tx_hash)
        self.assertEqual(e.exception.code, ExceptionCode.INVALID_PARAMETER)
        self.assertEqual(e.exception.message,
                         f'deploy_info is None: {score_address}')
        self.storage.get_deploy_info.assert_called_once_with(
            context, score_address)

        current_tx_hash = create_tx_hash()
        next_tx_hash = create_tx_hash()
        deploy_info = IconScoreDeployInfo(score_address, DeployState.INACTIVE,
                                          create_address(), current_tx_hash,
                                          next_tx_hash)
        self.storage.get_deploy_info = Mock(return_value=deepcopy(deploy_info))
        with self.assertRaises(InvalidParamsException) as e:
            self.storage.update_score_info(context, score_address, tx_hash)
        self.assertEqual(e.exception.code, ExceptionCode.INVALID_PARAMETER)
        self.assertEqual(
            e.exception.message, f'Invalid update: '
            f'tx_hash({tx_hash}) != next_tx_hash({next_tx_hash})')
        self.storage.get_deploy_info.assert_called_once_with(
            context, score_address)

        owner = create_address()
        current_tx_hash = create_tx_hash()
        deploy_info = IconScoreDeployInfo(score_address, DeployState.INACTIVE,
                                          owner, current_tx_hash, tx_hash)
        self.storage.get_deploy_info = Mock(return_value=deepcopy(deploy_info))
        self.storage.put_deploy_info = Mock()
        self.storage.get_deploy_tx_params = Mock(return_value=None)
        with self.assertRaises(InvalidParamsException) as e:
            self.storage.update_score_info(context, score_address, tx_hash)
        self.assertEqual(e.exception.code, ExceptionCode.INVALID_PARAMETER)
        self.assertEqual(e.exception.message, f'tx_params is None: {tx_hash}')
        self.storage.get_deploy_info.assert_called_once_with(
            context, score_address)
        self.storage.put_deploy_info.assert_called_once()
        ret_context, ret_deploy_info = self.storage.put_deploy_info.call_args[
            0]
        self.assertEqual(ret_context, context)
        expected = IconScoreDeployInfo(score_address, DeployState.ACTIVE,
                                       owner, tx_hash, ZERO_TX_HASH)
        self.assertEqual(ret_deploy_info.to_bytes(), expected.to_bytes())

        self.storage.get_deploy_info = Mock(return_value=deepcopy(deploy_info))
        self.storage.put_deploy_info = Mock()
        self.storage.get_deploy_tx_params = Mock(return_value=Mock(
            spec=IconScoreDeployTXParams))
        self.storage.update_score_info(context, score_address, tx_hash)
        self.storage.get_deploy_info.assert_called_once_with(
            context, score_address)
        self.storage.put_deploy_info.assert_called_once()
        ret_context, ret_deploy_info = self.storage.put_deploy_info.call_args[
            0]
        self.assertEqual(ret_context, context)
        expected = IconScoreDeployInfo(score_address, DeployState.ACTIVE,
                                       owner, tx_hash, ZERO_TX_HASH)
        self.assertEqual(ret_deploy_info.to_bytes(), expected.to_bytes())
        self.storage.get_deploy_tx_params.assert_called_once_with(
            context, tx_hash)