async def test_register_user_should_create_user(create_user, auth): mock_request = create_mock_request( data=dict(email=CREATE_USER_REQUEST.email, username=CREATE_USER_REQUEST.username, password=CREATE_USER_REQUEST.password)) mock_request.app.get.side_effect = [create_user, auth] users_api = UsersAPI() await users_api.register_user(mock_request) create_user.execute.assert_called_with(CREATE_USER_REQUEST)
async def test_login_should_return_400_if_user_does_not_exist(users, auth): message = "Invalid login credentials" users.find_by_credentials.return_value = None mock_request = create_mock_request( data=dict(email=USER.email, password=USER.password)) mock_request.app.get.side_effect = [users, auth] users_api = UsersAPI() response = await users_api.login(mock_request) users.find_by_credentials.assert_called_with(USER.email, USER.password) assert response.status == 400 assert response.content_type == "application/json" assert json.loads(response.text) == dict(errors=[message])
async def test_login_should_return_user_id_and_generated_token_if_credentials_match( users, auth): users.find_by_credentials.return_value = USER mock_request = create_mock_request( data=dict(email=USER.email, password=USER.password)) mock_request.app.get.side_effect = [users, auth] users_api = UsersAPI() response = await users_api.login(mock_request) users.find_by_credentials.assert_called_with(USER.email, USER.password) auth.generate_token.assert_called_with(USER_ID) assert response.status == 200 assert response.content_type == "application/json" assert json.loads(response.text) == dict(userId=USER_ID, token=TOKEN)
async def test_register_user_should_return_400_if_request_data_is_invalid( create_user, auth): mock_request = create_mock_request( data=dict(email=CREATE_USER_REQUEST.email, username=CREATE_USER_REQUEST.username, password=CREATE_USER_REQUEST.password)) mock_request.app.get.side_effect = [create_user, auth] message = "Some Error" users_api = UsersAPI() create_user.execute.side_effect = ValueError(message) response = await users_api.register_user(mock_request) assert response.status == 400 assert response.content_type == "application/json" assert json.loads(response.text) == dict(errors=[message])
async def test_register_user_should_return_user_id_and_generated_token( create_user, auth): mock_request = create_mock_request( data=dict(email=CREATE_USER_REQUEST.email, username=CREATE_USER_REQUEST.username, password=CREATE_USER_REQUEST.password)) mock_request.app.get.side_effect = [create_user, auth] users_api = UsersAPI() response = await users_api.register_user(mock_request) create_user.execute.assert_called_with(CREATE_USER_REQUEST) auth.generate_token.assert_called_with(USER_ID) assert response.status == 201 assert response.content_type == "application/json" assert json.loads(response.text) == dict(userId=USER_ID, token=TOKEN)
async def test_creates_path(create_path, users): mock_request = create_mock_request(CREATE_PATH_REQUEST_DATA) mock_request.get.return_value = USER_ID mock_request.app.get.side_effect = [create_path] create_path.execute.return_value = CreatePathResponse(path_id=PATH_ID) paths_api = PathsAPI() response = await paths_api.create_path(mock_request) mock_request.get.assert_called_with("user_id") create_path.execute.assert_called_with(CREATE_PATH_REQUEST) assert response.status == 201 assert response.content_type == "application/json" assert json.loads(response.text) == dict(pathId=PATH_ID)
async def test_update_path_returns_404_if_path_does_not_exist(update_path): update_path.execute.side_effect = PathNotFound mock_request = create_mock_request(UPDATE_PATH_REQUEST_DATA) mock_request.get.return_value = USER_ID mock_request.app.get.side_effect = [update_path] paths_api = PathsAPI() response = await paths_api.update_path(mock_request) mock_request.app.get.assert_called_with("update_path") assert response.status == 404 assert response.content_type == "application/json" result = json.loads(response.text) assert result.get("message") == "Learning path not found"
async def test_update_path_returns_403_if_user_id_does_not_match_author(update_path): update_path.execute.return_value = UPDATE_PATH_RESPONSE mock_request = create_mock_request(UPDATE_PATH_REQUEST_DATA) mock_request.get.return_value = "DifferentUser" mock_request.app.get.side_effect = [update_path] paths_api = PathsAPI() response = await paths_api.update_path(mock_request) mock_request.app.get.assert_called_with("update_path") assert response.status == 403 assert response.content_type == "application/json" result = json.loads(response.text) assert result.get("message") == "Update Request Forbidden"
async def test_get_path_returns_404_if_path_not_found(paths): paths.find_by_id.return_value = None mock_request = create_mock_request() mock_request.app.get.side_effect = [paths] mock_request.match_info.get.return_value = PATH_ID paths_api = PathsAPI() response = await paths_api.get_path(mock_request) paths.find_by_id.assert_called_with(PATH_ID) assert response.status == 404 assert response.content_type == "application/json" result = json.loads(response.text) assert result.get("message") == "Learning path not found"
async def test_create_path_raises_400_if_request_data_is_invalid(create_path, users): message = "Some Error" create_path.execute.side_effect = ValueError((message,)) mock_request = create_mock_request(CREATE_PATH_REQUEST_DATA) mock_request.get.return_value = USER_ID mock_request.app.get.side_effect = [create_path] create_path.execute.return_value = CreatePathResponse(path_id=PATH_ID) paths_api = PathsAPI() response = await paths_api.create_path(mock_request) assert response.status == 400 assert response.content_type == "application/json" assert json.loads(response.text) == dict(errors=[message])
async def test_update_path_returns_400_if_validation_error_is_raised(update_path): error_message = "Some Error" update_path.execute.side_effect = ValueError([error_message]) mock_request = create_mock_request(UPDATE_PATH_REQUEST_DATA) mock_request.get.return_value = USER_ID mock_request.app.get.side_effect = [update_path] paths_api = PathsAPI() response = await paths_api.update_path(mock_request) mock_request.app.get.assert_called_with("update_path") assert response.status == 400 assert response.content_type == "application/json" result = json.loads(response.text) assert error_message in result.get("errors")
async def test_updates_existing_path(update_path): update_path.execute.return_value = UPDATE_PATH_RESPONSE mock_request = create_mock_request(UPDATE_PATH_REQUEST_DATA) mock_request.get.return_value = USER_ID mock_request.app.get.side_effect = [update_path] paths_api = PathsAPI() response = await paths_api.update_path(mock_request) mock_request.app.get.assert_called_with("update_path") update_path.execute.assert_called_with(UPDATE_PATH_REQUEST) assert response.status == 200 assert response.content_type == "application/json" result = json.loads(response.text) assert result.get("id") == UPDATE_PATH.id assert result.get("title") == UPDATE_PATH.title assert result.get("created_on") == UPDATE_PATH.created_on.timestamp() assert result.get("updated_on") == UPDATE_PATH.updated_on.timestamp() assert result.get("categories") == UPDATE_PATH.categories
async def test_get_path_returns_path_with_id(paths): paths.find_by_id.return_value = PATH mock_request = create_mock_request() mock_request.app.get.side_effect = [paths] mock_request.match_info.get.return_value = PATH_ID paths_api = PathsAPI() response = await paths_api.get_path(mock_request) paths.find_by_id.assert_called_with(PATH_ID) assert response.status == 200 assert response.content_type == "application/json" result = json.loads(response.text) assignment = PATH.assignments[0] assert result.get("id") == PATH.id assert result.get("title") == PATH.title assert result.get("created_on") == PATH.created_on.timestamp() assert result.get("updated_on") == PATH.updated_on.timestamp() assert result.get("categories") == PATH.categories assert result.get("assignments") == [ dict(id=assignment.id, name=assignment.name, resource=assignment.resource, instructions=assignment.instructions)]
def create_participation_http_request(usecase): request = create_mock_request(dict(pathId=PATH_ID)) request.get.return_value = USER_ID request.app.get.side_effect = [usecase] return request