def test_cancel_user_invitation(default_header, test_record_settings): # we invite the german user and cancel it again # GIVEN invitee_email = test_record_settings('users.4.email') input = {'invitationType': 'USER', 'inviteeEmail': invitee_email} result = execute_gql_mutation(CREATE_INVITATION_MUTATION, _headers=default_header, **input) invitation_id = result['invitation']['id'] delete_emails() # WHEN execute_gql_mutation(CANCEL_INVITATION_MUTATION, _headers=default_header, id=invitation_id) # THEN result = execute_gql(QUERY_INVITATION_BY_ID, headers=default_header, variables={'id': invitation_id}) assert result['data']['invitation']['state'] == 'CANCELED' # test the information mail: emails = get_emails() assert len(emails) == 1 email = emails[0] assert email['to'][0] == input['inviteeEmail'] assert email['body'].lower().find( 'cancel') != -1, 'Info mail should include `cancel`'
def test_tag_two_user(admin_header, test1_user_obj, test2_user_obj): """ This test tags user 1 and user 2 """ # GIVEN payload = { 'id': test1_user_obj['id'], 'tags': [{'name': 'tag1'}, {'name': 'tag2'}, {'name': 'tag3'}], } user_one_tags = execute_gql_mutation(UPDATE_USER_MUTATION, _headers=admin_header, **payload)[ 'user' ]['tags'] tag1_user_one_id = list( filter(lambda edge: edge['node']['name'] == 'tag1', user_one_tags['edges']) )[0]['node']['id'] # WHEN payload = { 'id': test2_user_obj['id'], 'tags': [{'name': 'tag1'}, {'name': 'tag4'}, {'name': 'tag3'}, {'name': 'tag6'}], } user_two_tags = execute_gql_mutation(UPDATE_USER_MUTATION, _headers=admin_header, **payload)[ 'user' ]['tags'] tag1_user_two_id = list( filter(lambda edge: edge['node']['name'] == 'tag1', user_two_tags['edges']) )[0]['node']['id'] # THEN assert tag1_user_one_id == tag1_user_two_id assert user_two_tags['totalCount'] == 4
def test_accept_canceled_user_invitation(default_header, test_record_settings): """ This test - creates an invitation as user (a) to user (b) - cancels the invitation as user (a) - tries to accept the invitation as user (b) --> should fail """ # GIVEN invitee_email = test_record_settings('users.4.email') input = {'invitationType': 'USER', 'inviteeEmail': invitee_email} result = execute_gql_mutation(CREATE_INVITATION_MUTATION, _headers=default_header, **input) invitation_id = result['invitation']['id'] _, token = extract_invitation_link_and_token(get_emails()[0]['body']) execute_gql_mutation(CANCEL_INVITATION_MUTATION, _headers=default_header, id=invitation_id) # WHEN hubert_header = authenticated_header( login(invitee_email, test_record_settings('users.4.password'))) result = execute_gql_mutation( ACCEPT_INVITATION_MUTATION, _headers=hubert_header, acceptToken=token, _check_errors=False, _return_data=False, ) assert result['data']['acceptInvitation']['error'] is not None assert result['data']['acceptInvitation']['error'][ 'id'] == 'INVITATION_NOT_VALID' assert result['data']['acceptInvitation']['error']['data'] == 'CANCELED'
def test_query_all_user_tags(admin_header, test1_user_obj, test2_user_obj): # GIVEN execute_gql_mutation( UPDATE_USER_MUTATION, _headers=admin_header, **{ 'id': test1_user_obj['id'], 'tags': [{'name': 'tag1'}, {'name': 'tag2'}, {'name': 'tag3'}], }, ) execute_gql_mutation( UPDATE_USER_MUTATION, _headers=admin_header, **{ 'id': test2_user_obj['id'], 'tags': [{'name': 'tag1'}, {'name': 'tag5'}, {'name': 'foo3'}], }, ) # WHEN result = execute_gql( QUERY_ALL_USER_TAGS, headers=admin_header, variables={'name_Istartswith': 'tAg'} )['data']['allUserTags'] # THEN assert result['totalCount'] == 4, "foo is filtered out, so tag1, tag2, tag3 and tag5"
def test_query_invitation_using_token(default_header, test_record_settings): # we invite the admin user # GIVEN invitee_email = test_record_settings('users.4.email') input = {'invitationType': 'USER', 'inviteeEmail': invitee_email} # invite the user as default_user: execute_gql_mutation(CREATE_INVITATION_MUTATION, _headers=default_header, **input) _, token = extract_invitation_link_and_token(get_emails()[0]['body']) # WHEN hubert_header = authenticated_header( login(invitee_email, test_record_settings('users.1.password'))) result = execute_gql(QUERY_INVITATION_BY_TOKEN, headers=hubert_header, variables={'token': token}) invitation = result['data']['invitation'] # THEN assert invitation is not None assert invitation['state'] == STATE_PENDING assert invitation['inviteeEmail'] == invitee_email assert invitation['isValid'] assert invitation['invalidReason'] is None assert len(invitation['acceptPage']) > 0
def test_delete(test1_header): # GIVEN payload = {'text': 'default todo text', 'isDone': False} original_todo = execute_gql_mutation(CREATE_TODO_MUTATION, _headers=test1_header, **payload) # WHEN delete_payload = {'id': original_todo['todo']['id']} deleted_todo = execute_gql_mutation(DELETE_TODO_MUTATION, _headers=test1_header, **delete_payload) # THEN assert deleted_todo['error'] is None
def test_emails(): # GIVEN email_to = f"{uuid4()}@example.com" res = register_user(email_to, "123456") auth_header = {"Authorization": f"Token {res['token']}"} user_id = res["user"]["id"] # WHEN emails = get_emails() # THEN assert len(emails) == 1 assert emails[0].get("to")[0] == email_to assert len(emails[0].get("body")) > 100 assert len(emails[0].get("htmlMessage")) > 100 assert len(emails[0].get("subject")) > 5 assert "@" in emails[0].get("fromEmail") # CLEANUP payload = {"id": user_id} data = execute_gql_mutation(DELETE_USER_MUTATION, _headers=auth_header, **payload) pprint(data)
def test_send_signup_email(): """ Just here for local testing of sending registration email. """ email_to = "*****@*****.**" res = register_user(email_to, "Test1!") auth_header = {"Authorization": f"Token {res['token']}"} user_id = res["user"]["id"] # WHEN # THEN # CLEANUP payload = {"id": user_id} execute_gql_mutation(DELETE_USER_MUTATION, _headers=auth_header, **payload)
def test_update_user_empty_interests(test1_user_obj, test1_header): # GIVEN # WHEN result = execute_gql_mutation( UPDATE_USER_MUTATION, _headers=test1_header, **{'id': test1_user_obj['id'], 'interests': []} )['user'] # THEN assert len(result['interests']) == 0
def test_update_me(test1_user_obj, test1_header): # GIVEN user_id = test1_user_obj['id'] # WHEN data = execute_gql_mutation( UPDATE_ME_MUTATION, _headers=test1_header, **{'id': user_id, 'firstName': 'Saphod'} ) # THEN assert data['user']['firstName'] == 'Saphod'
def test_create_user_as_admin(admin_header, test_record_settings): # GIVEN email = f'test-create-user-with-tag@{test_record_settings("default_email_domain")}' payload = {'email': email} # WHEN data = execute_gql_mutation(CREATE_USER_MUTATION, _headers=admin_header, **payload) # THEN assert data['user']['email'] == email
def test_delete_user_as_admin(admin_header, test2_user_obj, api_is_production): # GIVEN user_id = test2_user_obj['id'] payload = {'id': user_id} # WHEN data = execute_gql_mutation(DELETE_USER_MUTATION, _headers=admin_header, **payload) # THEN assert data['error'] is None
def test_create_user_with_tag(admin_header, test_record_settings): # GIVEN payload = { 'email': f'test-create-user-with-tag@{test_record_settings("default_email_domain")}', 'tags': [{'name': 'tag1'}, {'name': 'tag2'}, {'name': 'tag3'}], } # WHEN result = execute_gql_mutation(CREATE_USER_MUTATION, _headers=admin_header, **payload)['user'] # THEN assert result['tags']['totalCount'] == 3
def test_update(test1_header): # GIVEN payload = {'text': 'updated todo text', 'isDone': True} original_todo = execute_gql_mutation(CREATE_TODO_MUTATION, _headers=test1_header, **payload) # WHEN update_payload = { 'id': original_todo['todo']['id'], 'text': 'default todo text', 'isDone': False, } updated_todo = execute_gql_mutation(UPDATE_TODO_MUTATION, _headers=test1_header, **update_payload) # THEN assert updated_todo['error'] is None assert updated_todo['todo']['id'] == original_todo['todo']['id'] assert updated_todo['todo']['text'] == update_payload['text'] assert updated_todo['todo']['isDone'] == update_payload['isDone']
def test_tag_user(admin_header, test1_user_obj): """ This test adds some new tags to user 1 (note: user 1 already has one tag before) """ # GIVEN payload = { 'id': test1_user_obj['id'], 'tags': [{'name': 'tag1'}, {'name': 'tag2'}, {'name': 'tag3'}], } # WHEN result = execute_gql_mutation(UPDATE_USER_MUTATION, _headers=admin_header, **payload)['user'] # THEN assert result['tags']['totalCount'] == 4
def test_reject_user_invitation(default_header, test_record_settings): # we invite the german user and reject the invitation as the german user # GIVEN invitee_email = test_record_settings('users.4.email') input = {'invitationType': 'USER', 'inviteeEmail': invitee_email} result = execute_gql_mutation(CREATE_INVITATION_MUTATION, _headers=default_header, **input) invitation_id = result['invitation']['id'] # WHEN hubert_header = authenticated_header( login(invitee_email, test_record_settings('users.4.password'))) execute_gql_mutation(REJECT_INVITATION_MUTATION, _headers=hubert_header, id=invitation_id) # THEN result = execute_gql(QUERY_INVITATION_BY_ID, headers=default_header, variables={'id': invitation_id}) assert result['data']['invitation']['state'] == 'REJECTED'
def test_resend_user_invitation(default_header, test_record_settings): # we invite the german user and reject the invitation as the german user # GIVEN invitee_email = test_record_settings('users.4.email') input = {'invitationType': 'USER', 'inviteeEmail': invitee_email} invitation_id = execute_gql_mutation(CREATE_INVITATION_MUTATION, _headers=default_header, **input)['invitation']['id'] delete_emails() assert len(get_emails()) == 0 # WHEN result = execute_gql_mutation(RESEND_INVITATION_MUTATION, _headers=default_header, id=invitation_id) # THEN assert isoparse(result['invitation']['created']) < isoparse( result['invitation']['updated']) emails = get_emails() assert len(emails) == 1, 'There must be one mail' assert emails[0]['to'][ 0] == invitee_email, 'Mail should be sent to the invitee'
def test_query(test1_header): # GIVEN payload = {'text': 'default todo text', 'isDone': False} original_todo = execute_gql_mutation(CREATE_TODO_MUTATION, _headers=test1_header, **payload) # WHEN todos = execute_gql(QUERY_ALL_USER_TODOS, headers=test1_header) # THEN queried_todo = todos['data']['me']['ownedOrganisation']['todos']['edges'][ 0]['node'] assert queried_todo['id'] == original_todo['todo']['id']
def test_create(test1_header): # GIVEN payload = {'text': 'default todo text', 'isDone': False} # WHEN result = execute_gql_mutation(CREATE_TODO_MUTATION, _headers=test1_header, **payload) # THEN todo = result['todo'] assert result['error'] is None assert todo['text'] == payload['text'] assert todo['isDone'] == payload['isDone']
def test_update_me_as_not_allowed(test1_user_obj, test2_header): # GIVEN user_id = test1_user_obj['id'] # WHEN result = execute_gql_mutation( UPDATE_ME_MUTATION, _headers=test2_header, _check_errors=False, _return_data=False, **{'id': user_id, 'firstName': 'Saphod'}, ) # THEN # permission denied error must be returned assert result['data']['updateMe']['error']['id'] == 'PERMISSION_DENIED_ERROR'
def test_accept_user_invitation_with_existing_user(default_header, test_record_settings): # we invite the german user # GIVEN invitee_email = test_record_settings('users.4.email') input = {'invitationType': 'USER', 'inviteeEmail': invitee_email} # invite the user as default_user: execute_gql_mutation(CREATE_INVITATION_MUTATION, _headers=default_header, **input) # retrieve the token by reading hubert's mail: _, token = extract_invitation_link_and_token(get_emails()[0]['body']) # WHEN # log in as hubert and call the acceptInvitationMutation as him: hubert_header = authenticated_header( login(invitee_email, test_record_settings('users.4.password'))) # accept result = execute_gql_mutation(ACCEPT_INVITATION_MUTATION, _headers=hubert_header, acceptToken=token) # THEN assert result['invitation']['state'] == 'ACCEPTED'
def test_create_user_not_allowed(test1_header, test_record_settings): # GIVEN # user payload email = f'test-create-user-with-tag@{test_record_settings("default_email_domain")}' payload = {'email': email} # WHEN # we try to create a user without permissions result = execute_gql_mutation( CREATE_USER_MUTATION, _headers=test1_header, _check_errors=False, _return_data=False, **payload, ) # THEN # it must retun an error assert result['data']['createUser']['error']['id'] == 'PERMISSION_DENIED_ERROR'
def test_delete_user_as_other_user(test1_header, test2_user_obj, api_is_production): # GIVEN # a user we want to delete user_id = test2_user_obj['id'] payload = {'id': user_id} # WHEN # we try to delete a user with another one who has no permission to do that result = execute_gql_mutation( DELETE_USER_MUTATION, _headers=test1_header, _check_errors=False, _return_data=False, **payload, ) # THEN # permission denied error must be returned assert result['data']['deleteUser']['error']['id'] == 'PERMISSION_DENIED_ERROR'
def test_update_user_image(admin_header, test2_user_obj, test2_header, api_is_production): # GIVEN user_id = test2_user_obj['id'] oldImg = execute_gql( QUERY_USER_PROFILE_PICTURE, headers=admin_header, variables={'id': user_id} )['data']['user']['profileImage'] payload = {'id': user_id, 'profileImageTemporaryId': upload_image(EXAMPLE_PROFILE_PICTURE_PATH)} # WHEN data = execute_gql_mutation( UPDATE_USER_PROFILE_IMAGE_MUTATION, _headers=test2_header, **payload ) # THEN newImg = execute_gql( QUERY_USER_PROFILE_PICTURE, headers=admin_header, variables={'id': user_id} )['data']['user']['profileImage'] assert newImg is not None and newImg != '' assert oldImg != newImg if not api_is_production: # test also if image is downloadable, (does not work on drone) assert is_static_content_available(newImg), "cannot not download uploaded image"
def test_sending_email_when_create_user_invitation(need_reset_emails, default_header): # GIVEN input = { 'invitationType': 'USER', 'inviteeEmail': f'invitee-{uuid4()}@example.com', 'message': 'Hey buddy!\nI just registered at vsocial. This app is great! Have a look :-)', } # WHEN result = execute_gql_mutation(CREATE_INVITATION_MUTATION, _headers=default_header, **input) # THEN # test the result: assert 'invitation' in result assert all(key in result['invitation'] for key in ('id', 'expires', 'created', 'state', 'invitationType', 'message', 'payload')) expires = isoparse(result['invitation']['expires']) assert expires > datetime.now(timezone.utc) assert result['invitation']['state'] == STATE_PENDING # test the sent mail: emails = get_emails() assert len(emails) == 1 email = emails[0] assert len(email['to']) == 1 assert email['to'][0] == input['inviteeEmail'] assert email['body'].find( 'Hey buddy!') != -1, 'Personal message should be in email text' extract_invitation_link_and_token(email['body'])