def test_all_events(self): """Ensure get all events behaves correctly.""" et1 = add_event_type("x-ray", 500) et2 = add_event_type("ct", 2000) add_event(et1.id, 5) add_event(et1.id, 4) add_event(et2.id, 5, reimbursed=True) with self.client: response = self.client.get('/events') data = json.loads(response.data.decode()) self.assertIn('success', data['status']) self.assertEqual(response.status_code, 200) self.assertEqual(len(data['data']['events']), 3) self.assertTrue('created_at' in data['data']['events'][0]) self.assertEqual(et1.id, data['data']['events'][0]['type_id']) self.assertEqual(5, data['data']['events'][0]['caregiver_id']) self.assertEqual(False, data['data']['events'][0]['reimbursed']) self.assertTrue('created_at' in data['data']['events'][1]) self.assertEqual(et1.id, data['data']['events'][1]['type_id']) self.assertEqual(4, data['data']['events'][1]['caregiver_id']) self.assertEqual(False, data['data']['events'][1]['reimbursed']) self.assertTrue('created_at' in data['data']['events'][2]) self.assertEqual(et2.id, data['data']['events'][2]['type_id']) self.assertEqual(5, data['data']['events'][2]['caregiver_id']) self.assertEqual(True, data['data']['events'][2]['reimbursed'])
def test_report_filter_caregivers(self): """Ensure get report filters caregivers.""" et1 = add_event_type("x-ray", 50000) et2 = add_event_type("ct", 200000) add_event(et1.id, 4) add_event(et2.id, 4) add_event(et2.id, 5) add_event(et2.id, 5) add_event(et2.id, 6) report = { now.strftime("%Y"): { now.strftime("%b"): { '4': { 'non-reimbursed SEK': 2500 }, '6': { 'non-reimbursed SEK': 2000 } } } } with self.client: response = self.client.post( '/events/report', data=json.dumps(dict(caregiver_ids=[4, 6, 7])), content_type='application/json', ) data = json.loads(response.data.decode()) self.assertEqual(response.status_code, 200) self.assertTrue('generated_at' in data['data']) self.assertEqual(report, data['data']['report']) self.assertIn('success', data['status'])
def test_simple_report(self): """Ensure get report behaves correctly.""" et1 = add_event_type("x-ray", 50000) et2 = add_event_type("ct", 200000) add_event(et1.id, 4) add_event(et2.id, 4) add_event(et2.id, 5) add_event(et2.id, 5) add_event(et2.id, 6) report = { now.strftime("%Y"): { now.strftime("%b"): { '4': { 'non-reimbursed SEK': 2500 }, '5': { 'non-reimbursed SEK': 4000 }, '6': { 'non-reimbursed SEK': 2000 } } } } with self.client: response = self.client.get('/events/report') data = json.loads(response.data.decode()) self.assertEqual(response.status_code, 200) self.assertTrue('generated_at' in data['data']) self.assertEqual(report, data['data']['report']) self.assertIn('success', data['status'])
def test_add_event(self): """Ensure a new event can be added to the database.""" et = add_event_type("x-ray", 500) with self.client: response = self.client.post( '/events', data=json.dumps( dict( type_id=et.id, caregiver_id=2, start_time=datetime.datetime.now().isoformat(), )), content_type='application/json', ) data = json.loads(response.data.decode()) self.assertEqual(response.status_code, 201) self.assertIn('success', data['status']) response = self.client.get(f'/events/{data["id"]}') data = json.loads(response.data.decode()) self.assertEqual(response.status_code, 200) self.assertTrue('created_at' in data['data']) self.assertEqual(et.id, data['data']['type_id']) self.assertEqual(2, data['data']['caregiver_id']) self.assertEqual(False, data['data']['reimbursed']) self.assertIn('success', data['status'])
def test_add_event_missing_json_keys(self): """ Ensure error is thrown if the JSON object lacks any required key. """ et = add_event_type("x-ray", 500) with self.client: response = self.client.post( '/events', data=json.dumps( dict(type_id=et.id, start_time=datetime.datetime.now().isoformat())), content_type='application/json', ) data = json.loads(response.data.decode()) self.assertEqual(response.status_code, 400) self.assertIn('Invalid payload.', data['message']) self.assertIn('fail', data['status']) response = self.client.post( '/events', data=json.dumps(dict(caregiver_id=5)), content_type='application/json', ) data = json.loads(response.data.decode()) self.assertEqual(response.status_code, 400) self.assertIn('Invalid payload.', data['message']) self.assertIn('fail', data['status'])
def test_delete_event_type_used_in_event(self): """Ensure deletion fails when event type is used in events.""" with self.client: et = add_event_type("x-ray", 500) event = add_event(et.id, 5) response = self.client.delete(f'/events/types/{et.id}') data = json.loads(response.data.decode()) self.assertEqual(response.status_code, 400) self.assertIn('Event type is used in existing events.', data['message']) self.assertIn('fail', data['status'])
def test_report_filter_time(self): """Ensure get report filters by time.""" et1 = add_event_type("x-ray", 50000) et2 = add_event_type("ct", 200000) add_event(et1.id, 4, start_time='2017-10-28T23:28:23.456701') add_event(et2.id, 4, start_time='2016-10-28T23:28:23.456701') add_event(et2.id, 5, start_time='2017-10-28T23:28:23.456701') add_event(et2.id, 5, start_time='2017-10-28T23:28:23.456701') add_event(et2.id, 5, reimbursed=True, start_time='2017-10-28T23:28:23.456701') add_event(et2.id, 5, start_time='2018-10-28T23:28:23.456701') report = { '2017': { 'Oct': { '4': { 'non-reimbursed SEK': 500 }, '5': { 'non-reimbursed SEK': 4000, 'reimbursed SEK': 2000 } } } } with self.client: response = self.client.post( '/events/report', data=json.dumps( dict(min_time='2017-09-28T23:28:23.456701', max_time='2017-11-28T23:28:23.456701')), content_type='application/json', ) data = json.loads(response.data.decode()) self.assertEqual(response.status_code, 200) self.assertTrue('generated_at' in data['data']) self.assertEqual(report, data['data']['report']) self.assertIn('success', data['status'])
def test_single_event_type(self): """Ensure get single event type behaves correctly.""" et = add_event_type("x-ray", 500) with self.client: response = self.client.get(f'/events/types/{et.id}') data = json.loads(response.data.decode()) self.assertEqual(response.status_code, 200) self.assertEqual(et.id, data['data']['id']) self.assertEqual('x-ray', data['data']['name']) self.assertEqual(500, data['data']['amount_in_cents']) self.assertEqual('SEK', data['data']['currency']) self.assertIn('success', data['status'])
def test_all_event_types(self): """Ensure get all event types behaves correctly.""" et1 = add_event_type("x-ray", 500) et2 = add_event_type("ct", 2000) with self.client: response = self.client.get('/events/types') data = json.loads(response.data.decode()) self.assertIn('success', data['status']) self.assertEqual(response.status_code, 200) self.assertEqual(len(data['data']['event_types']), 2) self.assertEqual(et1.id, data['data']['event_types'][0]['id']) self.assertEqual('x-ray', data['data']['event_types'][0]['name']) self.assertEqual(500, data['data']['event_types'][0]['amount_in_cents']) self.assertEqual('SEK', data['data']['event_types'][0]['currency']) self.assertEqual(et2.id, data['data']['event_types'][1]['id']) self.assertEqual('ct', data['data']['event_types'][1]['name']) self.assertEqual(2000, data['data']['event_types'][1]['amount_in_cents']) self.assertEqual('SEK', data['data']['event_types'][1]['currency'])
def test_add_duplicate_event_type(self): """Ensure error is thrown if the event_type name already exists.""" et = add_event_type("x-ray", 500) with self.client: response = self.client.post( '/events/types', data=json.dumps( dict(name="x-ray", amount_in_cents=500, currency="SEK")), content_type='application/json', ) data = json.loads(response.data.decode()) self.assertEqual(response.status_code, 400) self.assertIn('Invalid payload.', data['message']) self.assertIn('fail', data['status'])
def test_single_event(self): """Ensure get single event behaves correctly.""" et = add_event_type("x-ray", 500) event = add_event(et.id, 5) with self.client: response = self.client.get(f'/events/{event.id}') data = json.loads(response.data.decode()) self.assertEqual(response.status_code, 200) self.assertTrue('created_at' in data['data']) self.assertEqual(et.id, data['data']['type_id']) self.assertEqual(5, data['data']['caregiver_id']) self.assertEqual(False, data['data']['reimbursed']) self.assertIn('success', data['status'])
def test_add_event_with_wrong_date(self): """Ensure error is thrown when start_time is not valid.""" et = add_event_type("x-ray", 500) with self.client: response = self.client.post( '/events', data=json.dumps( dict(type_id=et.id, caregiver_id=2, start_time="fail")), content_type='application/json', ) data = json.loads(response.data.decode()) self.assertEqual(response.status_code, 400) self.assertIn('Invalid payload.', data['message']) self.assertIn('fail', data['status'])
def test_reimburse_reimbursed_event(self): """Ensure reimbursion fails when event is already reimbursed.""" et = add_event_type("x-ray", 500) event = add_event(et.id, 5, reimbursed=True) with self.client: response = self.client.get(f'/events/{event.id}') data = json.loads(response.data.decode()) self.assertEqual(response.status_code, 200) self.assertEqual(True, data['data']['reimbursed']) self.assertIn('success', data['status']) response = self.client.post(f'/events/{event.id}/reimburse') data = json.loads(response.data.decode()) self.assertEqual(response.status_code, 400) self.assertIn('Event already reimbursed', data['message']) self.assertIn('fail', data['status'])
def test_add_event_ignores_id(self): """Ensure new events can be not added with arbitrary id.""" et = add_event_type("x-ray", 500) with self.client: response = self.client.post( '/events', data=json.dumps( dict( id=1337, type_id=et.id, caregiver_id=2, start_time=datetime.datetime.now().isoformat(), )), content_type='application/json', ) data = json.loads(response.data.decode()) self.assertEqual(response.status_code, 201) self.assertIn('success', data['status']) self.assertEqual(1, data['id']) # that is, not 1337
def test_delete_event_type(self): """Ensure deletion of event type behaves correctly.""" et = add_event_type("x-ray", 500) with self.client: response = self.client.get(f'/events/types/{et.id}') data = json.loads(response.data.decode()) self.assertEqual(response.status_code, 200) self.assertIn('success', data['status']) response = self.client.delete(f'/events/types/{et.id}') data = json.loads(response.data.decode()) self.assertEqual(response.status_code, 200) self.assertIn('Event type deleted', data['message']) self.assertIn('success', data['status']) response = self.client.get(f'/events/types/{et.id}') data = json.loads(response.data.decode()) self.assertEqual(response.status_code, 404) self.assertIn('Event type does not exist', data['message']) self.assertIn('fail', data['status'])
def test_reimburse_event(self): """Ensure reimbursion of event behaves correctly.""" et = add_event_type("x-ray", 500) event = add_event(et.id, 5) with self.client: response = self.client.get(f'/events/{event.id}') data = json.loads(response.data.decode()) self.assertEqual(response.status_code, 200) self.assertEqual(False, data['data']['reimbursed']) self.assertIn('success', data['status']) response = self.client.post(f'/events/{event.id}/reimburse') data = json.loads(response.data.decode()) self.assertEqual(response.status_code, 200) self.assertIn('Event reimbursed', data['message']) self.assertIn('success', data['status']) response = self.client.get(f'/events/{event.id}') data = json.loads(response.data.decode()) self.assertEqual(response.status_code, 200) self.assertEqual(True, data['data']['reimbursed']) self.assertIn('success', data['status'])
def test_add_event_always_not_imbursed(self): """Ensure new events can be not added as already reimbursed.""" et = add_event_type("x-ray", 500) with self.client: response = self.client.post( '/events', data=json.dumps( dict( type_id=et.id, caregiver_id=2, start_time=datetime.datetime.now().isoformat(), reimbursed=True, )), content_type='application/json', ) data = json.loads(response.data.decode()) self.assertEqual(response.status_code, 201) self.assertIn('success', data['status']) response = self.client.get(f'/events/{data["id"]}') data = json.loads(response.data.decode()) self.assertEqual(response.status_code, 200) self.assertEqual(False, data['data']['reimbursed']) self.assertIn('success', data['status'])