Example #1
0
    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)
Example #3
0
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)
Example #4
0
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')
Example #5
0
    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)
Example #6
0
 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
Example #7
0
 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
Example #8
0
    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)
Example #9
0
    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)
Example #11
0
    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)
Example #16
0
  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']))
Example #17
0
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)
Example #20
0
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')
Example #21
0
    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)
Example #23
0
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')
Example #24
0
    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"])
Example #25
0
    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)
Example #26
0
    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)
Example #27
0
    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
Example #28
0
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')
Example #29
0
    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)