def test_happypath_get_a_room(self): user_1 = User(name='Test User', email='email 1') user_1.insert() room_1 = Room(name='Kitchen', image='exampleimage1.com', user_id=user_1.id) room_1.insert() room_2 = Room(name='Living Room', image='exampleimage2.com', user_id=user_1.id) room_2.insert() response = self.client.get( f'/api/v1/rooms/{room_2.id}' ) self.assertEqual(200, response.status_code) data = json.loads(response.data.decode('utf-8')) assert_payload_field_type_value(self, data, 'success', bool, True) results = data['data'] assert_payload_field_type_value( self, results, 'name', str, room_2.name ) assert_payload_field_type_value( self, results, 'image', str, room_2.image ) assert_payload_field_type_value( self, results, 'user_id', int, user_1.id )
def test_user_model_can_delete_record_and_its_contacts(self): user = User( email='*****@*****.**', first_name='joshua', last_name='carey', ) user.insert() self.assertEqual([], user.contacts) contact = Contact( user, { 'first_name': 'emilio', 'last_name': 'estevez', 'group': 'business', 'phone_number': '999-999-9999', 'street_address': '1234 fake st', 'street_address_2': 'unit 100', 'city': 'denver', 'state': 'colorado', 'zipcode': '80019' }) contact.insert() self.assertEqual([contact], user.contacts) user.delete() deleted_user = User.query.filter_by(id=user.id).first() self.assertIsNone(deleted_user) deleted_contact = Contact.query.filter_by(id=user.id).first() self.assertIsNone(deleted_contact)
class DeleteUserTest(unittest.TestCase): def setUp(self): self.app = create_app('testing') self.app_context = self.app.app_context() self.app_context.push() db.create_all() self.client = self.app.test_client() self.user = User(email='*****@*****.**', first_name='joshua', last_name='carey') self.user.insert() def tearDown(self): db.session.remove() db.drop_all() self.app_context.pop() def test_happypath_user_delete(self): user = self.user response = self.client.delete(f'/users/{self.user.id}') self.assertEqual(204, response.status_code) response = self.client.get(f'/users/{user.id}') self.assertEqual(404, response.status_code) def test_sadpath_user_delete_invalid_id(self): response = self.client.delete(f'/users/9999') self.assertEqual(404, response.status_code)
class DeleteUserTest(unittest.TestCase): def setUp(self): self.app = create_app('testing') self.app_context = self.app.app_context() self.app_context.push() db.create_all() self.client = self.app.test_client() self.user_1 = User(username='******', email='e1') self.user_1.insert() def tearDown(self): db.session.remove() db_drop_everything(db) self.app_context.pop() def test_happypath_delete_a_user(self): response = self.client.delete(f'/api/v1/users/{self.user_1.id}') self.assertEqual(204, response.status_code) self.assertEqual('', response.data.decode('utf-8')) # ensure it's really gone by getting a 404 if we try to fetch it again response = self.client.get(f'/api/v1/users/{self.user_1.id}') self.assertEqual(404, response.status_code) def test_sadpath_delete_bad_id_user(self): response = self.client.delete(f'/api/v1/users/9999999') self.assertEqual(404, response.status_code) data = json.loads(response.data.decode('utf-8')) assert_payload_field_type_value(self, data, 'error', int, 404) assert_payload_field_type_value(self, data, 'success', bool, False) assert_payload_field_type_value(self, data, 'message', str, 'resource not found')
def test_user_model(self): user = User(name='ian', email='*****@*****.**') user.insert() self.assertIsInstance(user, User) self.assertIsNotNone(user.id) self.assertEqual('ian', user.name) self.assertEqual('*****@*****.**', user.email)
def test_user_model_missing_name(self): try: user = User(name=None, email='*****@*****.**') user.insert() except IntegrityError: self.assertTrue(True) else: # we should not end up in here self.assertTrue(False) # pragma: no cover
def test_user_model_blank_email(self): try: user = User(name='ian', email='') user.insert() except IntegrityError: self.assertTrue(True) else: # we should not end up in here self.assertTrue(False) # pragma: no cover
def test_user_model_with_forced_id(self): user = User(username='******', email='*****@*****.**', user_id=1) user.insert() self.assertIsInstance(user, User) self.assertIsNotNone(user.id) self.assertEqual(1, user.id) self.assertEqual('ian', user.username) self.assertEqual('*****@*****.**', user.email)
def test_user_model(self): user = User(name='ian', email='*****@*****.**') user.insert() room = Room(name='Kitchen', image='exampleimage1.com', user_id=user.id) room.insert() self.assertIsInstance(room, Room) self.assertIsNotNone(room.id) self.assertEqual('Kitchen', room.name) self.assertEqual('exampleimage1.com', room.image) self.assertEqual(user.id, room.user_id)
def test_user_model_trims_space(self): user = User( email=' [email protected] ', first_name=' joshua ', last_name=' carey ', ) user.insert() self.assertEqual('joshua', user.first_name) self.assertEqual('carey', user.last_name) self.assertEqual('*****@*****.**', user.email)
def test_user_model_unique_email(self): user = User(name='ian', email='*****@*****.**') user.insert() try: user = User(name='ian2', email='*****@*****.**') user.insert() except IntegrityError: self.assertTrue(True) else: # we should not end up in here self.assertTrue(False) # pragma: no cover
def test_user_model_can_delete_record(self): user = User( email='*****@*****.**', first_name='joshua', last_name='carey', ) user.insert() user.delete() deleted_user = User.query.filter_by(id=user.id).first() self.assertIsNone(deleted_user)
def test_user_model_missing_email(self): try: user = User( email=None, first_name='joshua', last_name='carey', ) user.insert() except IntegrityError: self.assertTrue(True) else: # should not end here self.assertTrue(False)
def test_user_model(self): user = User( email='*****@*****.**', first_name='joshua', last_name='carey', ) user.insert() self.assertIsInstance(user, User) self.assertIsNotNone(user.id) self.assertEqual('joshua', user.first_name) self.assertEqual('carey', user.last_name) self.assertEqual('*****@*****.**', user.email)
def test_user_model_blank_last_name(self): try: user = User( email='*****@*****.**', first_name='joshua', last_name='', ) user.insert() except IntegrityError: self.assertTrue(True) else: # should not end here self.assertTrue(False)
def test_happypath_get_empty_rooms(self): user_1 = User(name='Test User', email='email 1') user_1.insert() response = self.client.get( f'/api/v1/users/{user_1.id}/rooms' ) self.assertEqual(200, response.status_code) data = json.loads(response.data.decode('utf-8)')) assert_payload_field_type_value(self, data, 'success', bool, True) assert_payload_field_type(self, data, 'data', list) self.assertEqual(0, len(data['data']))
class CreatememoryTest(unittest.TestCase): def setUp(self): self.app = create_app('testing') self.app_context = self.app.app_context() self.app_context.push() db.create_all() self.client = self.app.test_client() self.user_1 = User(name='Test User 2', email='email 3') self.user_1.insert() self.room_1 = Room(name='Kitchen', image='exampleimage1.com', user_id=self.user_1.id) self.room_1.insert() self.payload = { 'image': 'new_image', 'song': 'new_song', 'description': 'This is a new description', 'aromas': 'new_aroma', 'x': 500, 'y': 600 } def tearDown(self): db.session.remove() db_drop_everything(db) self.app_context.pop() def test_happypath_create_memory(self): payload = deepcopy(self.payload) response = self.client.post(f'/api/v1/rooms/{self.room_1.id}/memories', json=payload, content_type='application/json') self.assertEqual(201, response.status_code) data = json.loads(response.data.decode('utf-8')) assert_payload_field_type_value(self, data, 'success', bool, True) assert_payload_field_type(self, data, 'id', int) memory_id = data['id'] assert_payload_field_type_value(self, data, 'image', str, payload['image'].strip()) assert_payload_field_type_value(self, data, 'song', str, payload['song'].strip()) assert_payload_field_type_value(self, data, 'description', str, payload['description'].strip()) assert_payload_field_type_value(self, data, 'aromas', str, payload['aromas'].strip()) assert_payload_field_type_value(self, data, 'x', int, payload['x']) assert_payload_field_type_value(self, data, 'y', int, payload['y'])
def test_sad_path_user_has_zero_contacts(self): user = User(email='*****@*****.**', first_name='example', last_name='fake') user.insert() response = self.client.get(f'/users/{user.id}/contacts') self.assertEqual(200, response.status_code) data = json.loads(response.data.decode('utf-8')) assert_payload_field_type_value(self, data, 'success', bool, True) assert_payload_field_type(self, data, 'contacts', list) self.assertEqual(0, len(data['contacts']))
def test_user_model_can_update(self): user = User( email='*****@*****.**', first_name='joshua', last_name='carey', ) user.insert() user.email = '*****@*****.**' user.update() updated_user = User.query.filter_by(id=user.id).first() self.assertEqual('*****@*****.**', updated_user.email)
class GetUserTest(unittest.TestCase): def setUp(self): self.app = create_app('testing') self.app_context = self.app.app_context() self.app_context.push() db.create_all() self.client = self.app.test_client() self.user_1 = User(username='******', email='e1') self.user_1.insert() def tearDown(self): db.session.remove() db_drop_everything(db) self.app_context.pop() def test_happypath_get_a_user(self): response = self.client.get(f'/api/v1/users/{self.user_1.id}') self.assertEqual(200, response.status_code) data = json.loads(response.data.decode('utf-8')) assert_payload_field_type_value(self, data, 'success', bool, True) assert_payload_field_type_value(self, data, 'username', str, self.user_1.username) assert_payload_field_type_value(self, data, 'email', str, self.user_1.email) user_id = data['id'] assert_payload_field_type(self, data, 'links', dict) links = data['links'] assert_payload_field_type_value(self, links, 'get', str, f'/api/v1/users/{user_id}') assert_payload_field_type_value(self, links, 'patch', str, f'/api/v1/users/{user_id}') assert_payload_field_type_value(self, links, 'delete', str, f'/api/v1/users/{user_id}') assert_payload_field_type_value(self, links, 'index', str, '/api/v1/users') def test_endpoint_sadpath_bad_id_user(self): response = self.client.get(f'/api/v1/users/9999') self.assertEqual(404, response.status_code) data = json.loads(response.data.decode('utf-8')) assert_payload_field_type_value(self, data, 'error', int, 404) assert_payload_field_type_value(self, data, 'success', bool, False) assert_payload_field_type_value(self, data, 'message', str, 'resource not found')
def test_happypath_get_empty_rooms(self): user_1 = User(name='Test User', email='email 1') user_1.insert() room_1 = Room(name='Kitchen', image='exampleimage1.com', user_id=user_1.id) room_1.insert() response = self.client.get(f'/api/v1/rooms/{room_1.id}/memories') self.assertEqual(200, response.status_code) data = json.loads(response.data.decode('utf-8)')) assert_payload_field_type_value(self, data, 'success', bool, True) assert_payload_field_type(self, data, 'data', list) self.assertEqual(0, len(data['data']))
class ShowUserTest(unittest.TestCase): def setUp(self): self.app = create_app('testing') self.app_context = self.app.app_context() self.app_context.push() db.create_all() self.client = self.app.test_client() self.user_1 = User(email="jpwizard", first_name="james", last_name="potter") self.user_1.insert() self.user_2 = User(email="*****@*****.**", first_name="hiawatha", last_name="francisco") self.user_2.insert() def tearDown(self): db.session.remove() db.drop_all() self.app_context.pop() def test_happypath_show_user(self): response = self.client.get(f'/users/{self.user_1.id}') self.assertEqual(200, response.status_code) data = json.loads(response.data.decode('utf-8')) assert_payload_field_type_value(self, data, 'success', bool, True) assert_payload_field_type_value(self, data, 'first_name', str, self.user_1.first_name) assert_payload_field_type_value(self, data, 'last_name', str, self.user_1.last_name) assert_payload_field_type_value(self, data, 'email', str, self.user_1.email) def test_invalid_user_id(self): response = self.client.get('/users/9999') error_message = 'The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.' data = json.loads(response.data.decode('utf-8')) self.assertEqual(404, response.status_code) assert_payload_field_type_value(self, data, 'message', str, error_message)
class DeletememoryTest(unittest.TestCase): def setUp(self): self.app = create_app('testing') self.app_context = self.app.app_context() self.app_context.push() db.create_all() self.client = self.app.test_client() self.user_1 = User(name='Test User', email='email 2') self.user_1.insert() self.room_1 = Room(name='Kitchen', image='exampleimage1.com', user_id=self.user_1.id) self.room_1.insert() self.memory_1 = Memory(image='Picture string', song='song url', description='This is a great memory', aromas='Roast in the oven', x=123, y=456, room_id=self.room_1.id) self.memory_1.insert() def tearDown(self): db.session.remove() db_drop_everything(db) self.app_context.pop() def test_happypath_delete_a_memory(self): response = self.client.delete(f'/api/v1/memories/{self.memory_1.id}') self.assertEqual(204, response.status_code) self.assertEqual('', response.data.decode('utf-8')) # ensure it's really gone by getting a 404 if we try to fetch it again response = self.client.get(f'/api/v1/memories/{self.memory_1.id}') self.assertEqual(404, response.status_code) def test_sadpath_delete_bad_id_memory(self): response = self.client.delete(f'/api/v1/memories/9999999') self.assertEqual(404, response.status_code) data = json.loads(response.data.decode('utf-8')) assert_payload_field_type_value(self, data, 'error', int, 404) assert_payload_field_type_value(self, data, 'success', bool, False) assert_payload_field_type_value(self, data, 'message', str, 'resource not found')
def test_sadpath_email_not_unique(self): payload = deepcopy(self.payload) user = User(email=payload['email'], first_name=payload['first_name'], last_name=payload['last_name']) user.insert() response = self.client.post('/users', json=payload, content_type='application/json') self.assertEqual(400, response.status_code) data = json.loads(response.data.decode('utf-8')) assert_payload_field_type_value(self, data, 'success', bool, False) assert_payload_field_type_value(self, data, 'error', int, 400) assert_payload_field_type_value(self, data, 'errors', list, ["email is already taken"])
def test_happypath_get_all_users(self): user_1 = User(username='******', email='email 1') user_1.insert() user_2 = User(username='******', email='email 2') user_2.insert() response = self.client.get(f'/api/v1/users') self.assertEqual(200, response.status_code) data = json.loads(response.data.decode('utf-8')) assert_payload_field_type_value(self, data, 'success', bool, True) assert_payload_field_type(self, data, 'results', list) results = data['results'] # we expect user 2 first to ensure we're getting results in # ascending alphabetical order by username next_result = results[0] assert_payload_field_type_value(self, next_result, 'username', str, user_2.username) assert_payload_field_type_value(self, next_result, 'email', str, user_2.email) user_id = next_result['id'] assert_payload_field_type(self, next_result, 'links', dict) links = next_result['links'] assert_payload_field_type_value(self, links, 'get', str, f'/api/v1/users/{user_id}') assert_payload_field_type_value(self, links, 'patch', str, f'/api/v1/users/{user_id}') assert_payload_field_type_value(self, links, 'delete', str, f'/api/v1/users/{user_id}') assert_payload_field_type_value(self, links, 'index', str, '/api/v1/users') next_result = results[1] assert_payload_field_type_value(self, next_result, 'username', str, user_1.username) assert_payload_field_type_value(self, next_result, 'email', str, user_1.email) user_id = next_result['id'] assert_payload_field_type(self, next_result, 'links', dict)
def test_memory_model(self): user = User(name='ian', email='*****@*****.**') user.insert() room = Room(name='Kitchen', image='exampleimage1.com', user_id=user.id) room.insert() memory = Memory(image='Picture string', song='song url', description='This is a great memory', aromas='Roast in the oven', room_id=room.id, x=414, y=346) memory.insert() self.assertIsInstance(memory, Memory) self.assertIsNotNone(memory.id) self.assertEqual('Picture string', memory.image) self.assertEqual('song url', memory.song) self.assertEqual('This is a great memory', memory.description) self.assertEqual('Roast in the oven', memory.aromas) self.assertEqual(414, memory.x) self.assertEqual(346, memory.y) self.assertEqual(room.id, memory.room_id)
def _create_user(self, data): proceed = True errors = [] proceed, first_name, errors = _validate_field(data, 'first_name', proceed, errors) proceed, last_name, errors = _validate_field(data, 'last_name', proceed, errors) proceed, email, errors = _validate_field(data, 'email', proceed, errors) if proceed: try: user = User(email=email, first_name=first_name, last_name=last_name) user.insert() except IntegrityError: user = None errors.append("email is already taken") return user, errors else: return None, errors
class PatchmemoryTest(unittest.TestCase): def setUp(self): self.app = create_app('testing') self.app_context = self.app.app_context() self.app_context.push() db.create_all() self.client = self.app.test_client() self.user_1 = User(name='Test User', email='email 2') self.user_1.insert() self.room_1 = Room(name='Kitchen', image='exampleimage1.com', user_id=self.user_1.id) self.room_1.insert() self.memory_1 = Memory(image='Picture string', song='song url', description='This is a great memory', aromas='Roast in the oven', x=123, y=456, room_id=self.room_1.id) self.memory_1.insert() self.payload = { 'image': 'new_image', 'description': 'new_description', 'x': 200, 'y': 500 } def tearDown(self): db.session.remove() db_drop_everything(db) self.app_context.pop() def test_happypath_patch_a_memory(self): payload = deepcopy(self.payload) response = self.client.patch(f'/api/v1/memories/{self.memory_1.id}', json=payload, content_type='application/json') self.assertEqual(200, response.status_code) data = json.loads(response.data.decode('utf-8')) assert_payload_field_type_value(self, data, 'success', bool, True) assert_payload_field_type_value(self, data, 'image', str, payload['image'].strip()) assert_payload_field_type_value(self, data, 'description', str, payload['description'].strip()) # Fetching that memory and checking if it is updated response = self.client.get(f'/api/v1/rooms/{self.room_1.id}/memories') assert_payload_field_type_value(self, data, 'image', str, 'new_image') assert_payload_field_type_value(self, data, 'song', str, self.memory_1.song) assert_payload_field_type_value(self, data, 'description', str, 'new_description') assert_payload_field_type_value(self, data, 'aromas', str, self.memory_1.aromas) assert_payload_field_type_value(self, data, 'x', int, 200) assert_payload_field_type_value(self, data, 'y', int, 500) assert_payload_field_type_value(self, data, 'room_id', int, self.memory_1.room_id) def test_sadpath_patch_user_bad_id(self): response = self.client.patch(f'/api/v1/memories/999999') self.assertEqual(404, response.status_code) data = json.loads(response.data.decode('utf-8')) assert_payload_field_type_value(self, data, 'error', int, 404) assert_payload_field_type_value(self, data, 'success', bool, False) assert_payload_field_type_value(self, data, 'message', str, 'resource not found')
def test_happypath_get_all_memories(self): user_1 = User(name='Test User', email='email 1') user_1.insert() room_1 = Room(name='Kitchen', image='exampleimage1.com', user_id=user_1.id) room_1.insert() memory_1 = Memory(image='Picture string', song='song url', description='This is a great memory', aromas='Roast in the oven', x=123, y=456, room_id=room_1.id) memory_1.insert() memory_2 = Memory(image='Another string', song='this song url', description='Love this memory', aromas='Chestnuts roasting', x=678, y=234, room_id=room_1.id) memory_2.insert() response = self.client.get(f'/api/v1/rooms/{room_1.id}/memories') self.assertEqual(200, response.status_code) data = json.loads(response.data.decode('utf-8')) assert_payload_field_type_value(self, data, 'success', bool, True) assert_payload_field_type(self, data, 'data', list) results = data['data'] first_result = results[0] assert_payload_field_type_value(self, first_result, 'image', str, memory_1.image) assert_payload_field_type_value(self, first_result, 'song', str, memory_1.song) assert_payload_field_type_value(self, first_result, 'description', str, memory_1.description) assert_payload_field_type_value(self, first_result, 'aromas', str, memory_1.aromas) assert_payload_field_type_value(self, first_result, 'x', int, memory_1.x) assert_payload_field_type_value(self, first_result, 'y', int, memory_1.y) assert_payload_field_type_value(self, first_result, 'room_id', int, memory_1.room_id) second_result = results[1] assert_payload_field_type_value(self, second_result, 'image', str, memory_2.image) assert_payload_field_type_value(self, second_result, 'song', str, memory_2.song) assert_payload_field_type_value(self, second_result, 'description', str, memory_2.description) assert_payload_field_type_value(self, second_result, 'aromas', str, memory_2.aromas) assert_payload_field_type_value(self, second_result, 'x', int, memory_2.x) assert_payload_field_type_value(self, second_result, 'y', int, memory_2.y) assert_payload_field_type_value(self, second_result, 'room_id', int, memory_2.room_id)
class ShowContactTest(unittest.TestCase): def setUp(self): self.app = create_app('testing') self.app_context = self.app.app_context() self.app_context.push() db.create_all() self.client = self.app.test_client() self.user = User(email='*****@*****.**', first_name='joshua', last_name='carey') self.user.insert() self.contact_payload = { 'first_name': 'darrel', 'last_name': 'wadsworth', 'group': 'friend', 'phone_number': '999-999-9999', 'street_address': '45321 example way', 'city': 'Denver', 'state': 'Colorado', 'zipcode': '80000' } self.contact = Contact(self.user, self.contact_payload) self.contact.insert() def tearDown(self): db.session.remove() db.drop_all() self.app_context.pop() def test_happypath_get_contact(self): response = self.client.get(f'/users/{self.user.id}/contacts/{self.contact.id}') self.assertEqual(200, response.status_code) data = json.loads(response.data.decode('utf-8')) assert_payload_field_type_value(self, data, 'success', bool, True) assert_payload_field_type_value(self, data, 'first_name', str, self.contact_payload['first_name']) assert_payload_field_type_value(self, data, 'last_name', str, self.contact_payload['last_name']) assert_payload_field_type_value(self, data, 'group', str, self.contact_payload['group']) assert_payload_field_type_value(self, data, 'phone_number', str, self.contact_payload['phone_number']) assert_payload_field_type_value(self, data, 'street_address', str, self.contact_payload['street_address']) assert_payload_field_type_value(self, data, 'city', str, self.contact_payload['city']) assert_payload_field_type_value(self, data, 'state', str, self.contact_payload['state']) assert_payload_field_type_value(self, data, 'zipcode', str, self.contact_payload['zipcode']) def test_sadpath_invalid_contact_id(self): contact_id = 99999 response = self.client.get(f'/users/{self.user.id}/contacts/{contact_id}') self.assertEqual(400, response.status_code) data = json.loads(response.data.decode('utf-8')) assert_payload_field_type_value(self, data, 'success', bool, False) assert_payload_field_type_value(self, data, 'error', int, 400) assert_payload_field_type_value(self, data, 'errors', list, [f"contact with id: '{contact_id}' not found"]) def test_sadpath_invalid_user_id(self): response = self.client.get(f'/users/99999/contacts/{self.contact.id}') self.assertEqual(404, response.status_code)