def test_filter_date_no_receipts(self):
        date_from = "22-07-1900"
        start = datetime.strptime(date_from, '%d-%m-%Y').date()
        date_to = "22-09-1900"
        end = datetime.strptime(date_from, '%d-%m-%Y').date()

        date_text = "22-09-2018"
        date = datetime.strptime(date_text, '%d-%m-%Y').date()

        add_receipt(15, date, "GitHub", "00.000.000/0000-00", 20.0, 50.0,
                    "Geladeira", "Isso é uma descrição bem grande", None)
        add_receipt(16, date, "Gitlab", "00.000.000/0000-00", 15.0, 20.0,
                    "Notebook", "Isso é outro description", None)

        with self.client:

            response = self.client.post(
                '/15/select_date',
                data=json.dumps({
                    "period": {
                        "date_from": start.isoformat(),
                        "date_to": end.isoformat()
                    }
                }),
                content_type='application/json',
            )

            data = json.loads(response.data.decode())

            self.assertEqual(response.status_code, 400)
            self.assertIn('no receipts', data['empty'])
    def test_get_all_receipts(self):
        date_text = "22-09-2018"
        date = datetime.strptime(date_text, '%d-%m-%Y').date()

        add_receipt(15, date, "GitHub", "00.000.000/0000-00", 20.0, 50.0,
                    "Geladeira", "Isso é uma descrição bem grande", None)
        add_receipt(16, date, "Gitlab", "00.000.000/0000-00", 15.0, 20.0,
                    "Notebook", "Isso é outro description", None)

        with self.client:
            response = self.client.get('/15/receipts')
            data = json.loads(response.data.decode())

            self.assertEqual(response.status_code, 200)
            self.assertEqual(len(data['data']['receipts']), 1)

            self.assertIn('success', data['status'])

            self.assertEqual(15, data['data']['receipts'][0]['company_id'])
            self.assertEqual(date.isoformat(),
                             data['data']['receipts'][0]['emission_date'])
            self.assertIn('GitHub',
                          data['data']['receipts'][0]['emission_place'])
            self.assertIn('00.000.000/0000-00',
                          data['data']['receipts'][0]['cnpj'])
            self.assertEqual(20.0, data['data']['receipts'][0]['tax_value'])
            self.assertEqual(50.0, data['data']['receipts'][0]['total_price'])
            self.assertIn('Geladeira', data['data']['receipts'][0]['title'])
            self.assertIn('Isso é uma descrição bem grande',
                          data['data']['receipts'][0]['description'])
            self.assertEqual(None, data['data']['receipts'][0]['tag_id'])
    def test_filter_date_missing_date_to(self):
        date_from = "22-07-2018"
        start = datetime.strptime(date_from, '%d-%m-%Y').date()

        date_text = "22-09-2018"
        date = datetime.strptime(date_text, '%d-%m-%Y').date()

        add_receipt(15, date, "GitHub", "00.000.000/0000-00", 20.0, 50.0,
                    "Geladeira", "Isso é uma descrição bem grande", None)
        add_receipt(15, date, "Gitlab", "00.000.000/0000-00", 15.0, 20.0,
                    "Notebook", "Isso é outro description", None)

        with self.client:

            response = self.client.post(
                '/15/select_date',
                data=json.dumps({"period": {
                    "date_from": start.isoformat()
                }}),
                content_type='application/json',
            )

            data = json.loads(response.data.decode())

            self.assertEqual(response.status_code, 200)

            self.assertEqual(15, data['receipts'][0]['company_id'])
            self.assertEqual(date.isoformat(),
                             data['receipts'][0]['emission_date'])
            self.assertIn('GitHub', data['receipts'][0]['emission_place'])
            self.assertIn('00.000.000/0000-00', data['receipts'][0]['cnpj'])
            self.assertEqual(20.0, data['receipts'][0]['tax_value'])
            self.assertEqual(50.0, data['receipts'][0]['total_price'])
            self.assertIn('Geladeira', data['receipts'][0]['title'])
            self.assertIn('Isso é uma descrição bem grande',
                          data['receipts'][0]['description'])
            self.assertEqual(None, data['receipts'][0]['tag_id'])

            self.assertEqual(15, data['receipts'][1]['company_id'])
            self.assertEqual(date.isoformat(),
                             data['receipts'][1]['emission_date'])
            self.assertIn('Gitlab', data['receipts'][1]['emission_place'])
            self.assertIn('00.000.000/0000-00', data['receipts'][1]['cnpj'])
            self.assertEqual(15.0, data['receipts'][1]['tax_value'])
            self.assertEqual(20.0, data['receipts'][1]['total_price'])
            self.assertIn('Notebook', data['receipts'][1]['title'])
            self.assertIn('Isso é outro description',
                          data['receipts'][1]['description'])
            self.assertEqual(None, data['receipts'][1]['tag_id'])
    def test_update_receipt(self):
        date_text = "22-09-2018"
        date = datetime.strptime(date_text, '%d-%m-%Y').date()

        receipt = add_receipt(15, date, "GitHub", "00.000.000/0000-00", 20.0,
                              50.0, "Geladeira",
                              "Isso é uma descrição bem grande", None)

        with self.client:
            response = self.client.put(
                f'/15/update_receipt/{receipt.id}',
                data=json.dumps({
                    'emission_date': date.isoformat(),
                    'emission_place': 'lalala',
                    'cnpj': '00.000.000/0000-00',
                    'tax_value': '123.12',
                    'total_price': '456.45',
                    'title': 'oi',
                    'description': 'Geladeira Electrolux em 12x'
                }),
                content_type='application/json',
            )

            data = json.loads(response.data.decode())

            self.assertEqual(response.status_code, 201)
            self.assertIn('Receipt Updated', data['data']['message'])
            self.assertIn('success', data['status'])
    def test_remove_receipt_not_found(self):
        date_text = "22-09-2018"
        date = datetime.strptime(date_text, '%d-%m-%Y').date()

        receipt = add_receipt(16, date, "GitHub", "00.000.000/0000-00", 20.0,
                              50.0, 'Geladeira', 'Geladeira Electrolux em 12x',
                              None)

        with self.client:
            response = self.client.delete(f'/15/receipt/{receipt.id}')
            data = json.loads(response.data.decode())

            self.assertEqual(response.status_code, 404)
            self.assertIn('fail', data['status'])
            self.assertIn('Receipt not found', data['message'])
    def test_detach_tag(self):
        date_text = "22-09-2018"
        date = datetime.strptime(date_text, '%d-%m-%Y').date()

        receipt = add_receipt(15, date, "GitHub", "00.000.000/0000-00", 20.0,
                              50.0, "Geladeira",
                              "Isso é uma descrição bem grande", None)

        with self.client:
            response = self.client.patch(f'/15/update_tag/{receipt.id}',
                                         data=json.dumps({'tag_id': None}),
                                         content_type='application/json')

            data = json.loads(response.data.decode())

            self.assertEqual(response.status_code, 200)
            self.assertIn('Tag detached from a receipt!',
                          data['data']['message'])
            self.assertIn('success', data['status'])
    def test_update_receipt_wrong_json(self):
        date_text = "22-09-2018"
        date = datetime.strptime(date_text, '%d-%m-%Y').date()

        receipt = add_receipt(15, date, "GitHub", "00.000.000/0000-00", 20.0,
                              50.0, "Geladeira",
                              "Isso é uma descrição bem grande", None)

        with self.client:
            response = self.client.put(
                f'/15/update_receipt/{receipt.id}',
                data=json.dumps({}),
                content_type='application/json',
            )

            data = json.loads(response.data.decode())

            self.assertEqual(response.status_code, 400)
            self.assertIn('Wrong JSON', data['message'])
            self.assertIn('fail', data['status'])
    def test_update_tag_not_found(self):
        date_text = "22-09-2018"
        date = datetime.strptime(date_text, '%d-%m-%Y').date()

        receipt = add_receipt(16, date, "GitHub", "00.000.000/0000-00", 20.0,
                              50.0, "Geladeira",
                              "Isso é uma descrição bem grande", None)

        add_tag('Alimentação', 15, '#844155')

        with self.client:
            response = self.client.patch(f'/15/update_tag/{receipt.id}',
                                         data=json.dumps({'tag_id': 1}),
                                         content_type='application/json')

            data = json.loads(response.data.decode())

            self.assertEqual(response.status_code, 404)
            self.assertIn('Receipt not found', data['message'])
            self.assertIn('fail', data['status'])
    def test_get_single_receipt(self):
        date_text = "22-09-2018"
        date = datetime.strptime(date_text, '%d-%m-%Y').date()
        receipt = add_receipt(15, date, "GitHub", "00.000.000/0000-00", 20.0,
                              50.0, 'Geladeira', 'Geladeira Electrolux em 12x',
                              None)

        with self.client:
            response = self.client.get(f'/15/receipt/{receipt.id}')
            data = json.loads(response.data.decode())

            self.assertEqual(response.status_code, 200)
            self.assertIn('success', data['status'])

            self.assertEqual(15, data['data']['company_id'])
            self.assertEqual(date.isoformat(), data['data']['emission_date'])
            self.assertIn('GitHub', data['data']['emission_place'])
            self.assertIn('00.000.000/0000-00', data['data']['cnpj'])
            self.assertEqual(20.0, data['data']['tax_value'])
            self.assertEqual(50.0, data['data']['total_price'])
            self.assertIn('Geladeira', data['data']['title'])
            self.assertIn('Geladeira Electrolux em 12x',
                          data['data']['description'])
            self.assertEqual(None, data['data']['tag_id'])