def test_success(self, upload_to_doc_service_mock):
        tender_id = "a" * 32
        award_id = "f" * 32
        data = b"<?xml>Hello"
        name = "26591010101017J1603101100000000111220172659.KVT"

        with patch("fiscal_bot.tasks.requests") as requests_mock:
            requests_mock.post.return_value = MagicMock(
                status_code=200,
                content=data,
                headers={
                    "content-disposition":
                    "attachment; filename={}.p7s".format(name)
                },
            )

            decode_and_save_data(name, base64.b64encode(data), tender_id,
                                 award_id)

        requests_mock.post.assert_called_once_with(
            "{}/decrypt_fiscal/file".format(API_SIGN_HOST),
            files={'file': (name, data)},
            auth=(API_SIGN_USER, API_SIGN_PASSWORD),
            timeout=(CONNECT_TIMEOUT, READ_TIMEOUT),
        )

        upload_to_doc_service_mock.delay.assert_called_once_with(
            item_name='award',
            item_id='f' * 32,
            content=base64.b64encode(data).decode(),
            name=name + ".p7s",
            doc_type=DOC_TYPE,
            tender_id='a' * 32)
    def test_422_error(self, retry_mock, upload_to_doc_service_mock):
        tender_id = "a" * 32
        award_id = "f" * 32
        name = "26591010101017J1603101100000000111220172659.KVT"
        data = "aGVsbG8="

        with patch("fiscal_bot.tasks.requests") as requests_mock:
            requests_mock.post.return_value = MagicMock(status_code=422,
                                                        text="Unexpected smt",
                                                        headers={})
            decode_and_save_data(name, data, tender_id, award_id)

        retry_mock.assert_not_called()
        upload_to_doc_service_mock.delay.assert_not_called()
    def test_connection_error(self, requests_mock, retry_mock):
        retry_mock.side_effect = Retry
        tender_id = "a" * 32
        award_id = "f" * 32
        name = "26591010101017J1603101100000000111220172659.KVT"
        data = "aGVsbG8="

        requests_mock.post.side_effect = requests.exceptions.ConnectionError(
            "You shall not pass!")

        with self.assertRaises(Retry):
            decode_and_save_data(name, data, tender_id, award_id)

        retry_mock.assert_called_once_with(exc=requests_mock.post.side_effect)
    def test_500_error(self, requests_mock, retry_mock):
        retry_mock.side_effect = Retry
        tender_id = "a" * 32
        award_id = "f" * 32
        name = "26591010101017J1603101100000000111220172659.KVT"
        data = "aGVsbG8="

        requests_mock.post.return_value = MagicMock(
            status_code=500,
            text="Unexpected smt",
            headers={"Retry-After": 14})

        with self.assertRaises(Retry):
            decode_and_save_data(name, data, tender_id, award_id)

        retry_mock.assert_called_once_with(countdown=14)