async def test_update_user_update_all_fields(self): expected_new_name = "Novo Nome" expected_new_email = "*****@*****.**" new_user = User(**USER_WITH_MULTIPLE_ACCOUNTS_DICT) new_user.name = expected_new_name new_user.email = expected_new_email resp = await self.client.patch( f"/users/{USER_WITH_MULTIPLE_ACCOUNTS_ID}", headers={ "Authorization": f"Token {USER_WITH_MULTIPLE_ACCOUNTS_AUTH_KEY}" }, json=new_user.dict(), ) self.assertEqual(HTTPStatus.ACCEPTED, resp.status) user_data = await resp.json() self.assertEqual(UserResource(user=new_user).dict(), user_data) resp = await self.client.get( f"/users/{USER_WITH_MULTIPLE_ACCOUNTS_ID}", headers={ "Authorization": f"Token {USER_WITH_MULTIPLE_ACCOUNTS_AUTH_KEY}" }, ) updated_user_data = await resp.json() self.assertEqual(UserResource(user=new_user).dict(), updated_user_data)
async def test_encode_new_token(self): """ Dado um objeto User e um Account, retorna um novo token JWT contendo as informações necessárias """ user = User(**USER_WITH_ONE_ACCOUNT_DICT) account = Account(**ACCOUNT_DEV_DICT) token = jwt_encode(user, account) decoded_token = jwt.decode(token, key=SECRET_KEY) self.assertDictEqual(user.dict(), decoded_token["user"]) self.assertDictEqual(account.dict(), decoded_token["current_account"])
async def test_create_user_all_OK(self): user = User(name="New User", email="*****@*****.**") resp = await self.client.post( f"/users", headers={ "Authorization": f"Token {USER_WITH_MULTIPLE_ACCOUNTS_AUTH_KEY}" }, json=user.dict(), ) self.assertEqual(201, resp.status) user_data = await resp.json() expected_result = UserResource(user=user).dict() expected_result["user"]["id"] = ANY self.assertEqual(expected_result, user_data)
async def test_update_user_cant_update_another_user(self): """ Dado um request PATCH /users/42 {"id": 50, "name": "Nome", "email": "email"} Não podemos, no final das contas ter atualizado o user id=50. Temos que atualizar o user id=42 """ expected_new_name = "Novo Nome" expected_new_email = "*****@*****.**" new_user = User(**USER_WITH_MULTIPLE_ACCOUNTS_DICT) new_user.name = expected_new_name new_user.email = expected_new_email new_user.id = USER_WITH_NO_ACCOUNTS_ID resp = await self.client.patch( f"/users/{USER_WITH_MULTIPLE_ACCOUNTS_ID}", headers={ "Authorization": f"Token {USER_WITH_MULTIPLE_ACCOUNTS_AUTH_KEY}" }, json=new_user.dict(), ) self.assertEqual(HTTPStatus.ACCEPTED, resp.status) user_data = await resp.json() expected_returned_user = User(**USER_WITH_MULTIPLE_ACCOUNTS_DICT) expected_returned_user.name = expected_new_name expected_returned_user.email = expected_new_email self.assertEqual( UserResource(user=expected_returned_user).dict(), user_data) resp = await self.client.get( f"/users/{USER_WITH_NO_ACCOUNTS_ID}", headers={ "Authorization": f"Token {USER_WITH_MULTIPLE_ACCOUNTS_AUTH_KEY}" }, ) updated_user_data = await resp.json() self.assertEqual( UserResource(user=User(**USER_WITH_NO_ACCOUNTS_DICT)).dict(), updated_user_data, )
async def test_create_user_duplicate_email(self): user = User(name="New User", email=USER_WITH_MULTIPLE_ACCOUNTS_EMAIL) resp = await self.client.post( f"/users", headers={ "Authorization": f"Token {USER_WITH_MULTIPLE_ACCOUNTS_AUTH_KEY}" }, json=user.dict(), ) self.assertEqual(422, resp.status) resp_data = await resp.json() expected_error_message = """ERROR: duplicate key value violates unique constraint "user_tx_email_key"\nDETAIL: Key (tx_email)=([email protected]) already exists.\n""" self.assertEqual( ErrorResource(errors=[ErrorDetail( msg=expected_error_message)]).dict(), resp_data, )
def jwt_encode(user: User, account: Account) -> bytes: """ Encodes a new JWT Token https://tools.ietf.org/html/rfc7519#section-4.1.5 """ issued_at = datetime.utcnow() expiration_time = issued_at + timedelta(days=7) not_before = issued_at + timedelta(seconds=0) return jwt.encode( { "exp": expiration_time, "iat": issued_at, "nbf": not_before, "user": user.dict(), "current_account": account.dict(), }, SECRET_KEY, )