def test_dont_add_user_if_user_id_missing(test_client, api_headers_bearer, insert_tokens): password = "******" user = User(first_name="Max", last_name="Muster", email="*****@*****.**", password=password) user = insert_user(user) user_tokens = insert_tokens(user.email) group = Group(name="Group") insert_group(group) group_add_user_data = {"bla": "bla"} response = test_client.post("/groups/{}/members".format(group.id), headers=api_headers_bearer( user_tokens["access_token"]["token"]), data=json.dumps(group_add_user_data)) json_response = json.loads(response.get_data(as_text=True)) assert response.status_code == 400 assert json_response["message"] == "Missing attribute email" assert len(group.group_members) == 0
def test_dont_add_user_if_user_not_exist(test_client, api_headers_bearer, insert_tokens): password = "******" user = User(first_name="Max", last_name="Muster", email="*****@*****.**", password=password) user = insert_user(user) tokens = insert_tokens(user.email) group_member = GroupMember(user=user) group = Group(name="Group", group_members=[group_member]) insert_group(group) group_add_user_data = { "user_id": 2, } response = test_client.post("/groups/{}/members".format(group.id), headers=api_headers_bearer( tokens["access_token"]["token"]), data=json.dumps(group_add_user_data)) json_response = json.loads(response.get_data(as_text=True)) assert response.status_code == 400 assert json_response["message"] == "User does not exist" assert len(get_all_users()) == 1
def test_error_on_name_wrong_type(test_client, api_headers_bearer, insert_tokens): password = "******" user = User(first_name="Max", last_name="Muster", email="*****@*****.**", password=password) user = insert_user(user) tokens = insert_tokens(user.email) group_data = { "name": True, "members": [ { "id": user.id, } ] } response = test_client.post("/groups", headers=api_headers_bearer( tokens["access_token"]["token"]), data=json.dumps(group_data)) json_response = json.loads(response.get_data(as_text=True)) assert response.status_code == 400 assert json_response["message"] == "Attribute name needs to be of type str" assert len(get_all_groups()) == 0
def test_token_gets_saved(test_client, api_headers): password = "******" user = User(email="*****@*****.**", password=password, first_name="Max", last_name="Muster") insert_user(user) data = {"email": user.email, "password": password} test_client.post("/tokens", headers=api_headers, data=json.dumps(data)) tokens = get_user_tokens(user.email) assert len(tokens) == 2 assert tokens[0].revoked is False assert tokens[1].revoked is False
def test_add_not_registered_user_to_existing_group(test_client, api_headers_bearer, insert_tokens): password = "******" user1 = User(first_name="Max", last_name="Muster", email="*****@*****.**", password=password) user1 = insert_user(user1) user1_tokens = insert_tokens(user1.email) group_member1 = GroupMember(user=user1) group = Group(name="Muster", group_members=[group_member1]) insert_group(group) group_add_user_data = {"email": "*****@*****.**"} response = test_client.post("/groups/{}/members".format(group.id), headers=api_headers_bearer( user1_tokens["access_token"]["token"]), data=json.dumps(group_add_user_data)) json_response = json.loads(response.get_data(as_text=True)) assert response.status_code == 201 assert json_response["message"] == "Added user to group" group = get_group_by_id(group.id) assert len(group.group_members) == 2
def test_needs_to_be_confirmed_on_put(test_client, api_headers_bearer, insert_tokens): user = User(first_name="Max", last_name="Muster", email="*****@*****.**", password="******") insert_user(user) tokens = insert_tokens(user.email) response = test_client.put("/bills/1", headers=api_headers_bearer( tokens["access_token"]["token"])) json_response = json.loads(response.get_data(as_text=True)) assert response.status_code == 403 assert json_response[ "message"] == "Account needs to be confirmed for this operation"
def test_error_on_email_missing(test_client, api_headers): password = "******" user = User(email="*****@*****.**", password=password, first_name="Max", last_name="Muster") insert_user(user) data = {"password": password} response = test_client.post("/tokens", headers=api_headers, data=json.dumps(data)) json_response = json.loads(response.get_data(as_text=True)) assert response.status_code == 400 assert "message" in json_response assert json_response["message"] == "Missing attribute email"
def test_dont_get_token_if_password_incorrect(test_client, api_headers): password = "******" user = User(email="*****@*****.**", password=password, first_name="Max", last_name="Muster") insert_user(user) data = {"email": user.email, "password": password + "wrong"} response = test_client.post("/tokens", headers=api_headers, data=json.dumps(data)) json_response = json.loads(response.get_data(as_text=True)) assert response.status_code == 403 assert "message" in json_response assert json_response["message"] == "Incorrect email or password"
def test_is_friends_with_user_return_false_if_not_friend_with_user(app): user1 = User(first_name="Max", last_name="Muster", email="*****@*****.**", password="******") insert_user(user1) user2 = User(first_name="Max", last_name="Muster", email="*****@*****.**", password="******") insert_user(user2) insert_friend(Friend(user=user1, friend=user2)) result = is_friend_with_user(user2.id, user1.id) assert result is False
def test_dont_change_date_created_of_existing_bill(test_client, api_headers_bearer, insert_tokens): password = "******" now = datetime.datetime.utcnow() user1 = User(first_name="Max", last_name="Muster", email="*****@*****.**", confirmed=True, password=password) insert_user(user1) user1_tokens = insert_tokens(user1.email) user2 = User(first_name="Max", last_name="Muster", email="*****@*****.**", confirmed=True, password=password) insert_user(user2) bill_member1 = BillMember(user_id=user1.id, amount="5.00") bill_member2 = BillMember(user_id=user2.id, amount="-5.00") bill1 = Bill(description="Bill", date=now, date_created=now, members=[bill_member1, bill_member2]) bill_id = insert_bill(bill1).id data = {"date_created": datetime.datetime.utcnow()} response = test_client.put( "/bills/{}".format(bill_id), headers=api_headers_bearer(user1_tokens["access_token"]["token"]), data=json.dumps(data, default=json_data_encoder)) json_response = json.loads(response.get_data(as_text=True)) bill = get_bill_by_id(bill_id) assert response.status_code == 400 assert json_response[ "message"] == "Attribute date_created should not be set" assert bill.date_created == now
def test_dont_add_bill_if_amounts_sum_not_zero(test_client, api_headers_bearer, insert_tokens): password = "******" now = datetime.datetime.utcnow() user1 = User(first_name="Max", last_name="Muster", email="*****@*****.**", password=password) insert_user(user1) user1_tokens = insert_tokens(user1.email) user2 = User(first_name="Max", last_name="Muster", email="*****@*****.**", password=password) insert_user(user2) bill_data = { "description": "Important bill", "date": now, "date_created": now, "members": [{ "user_id": user1.id, "amount": 200 }, { "user_id": user2.id, "amount": -201 }] } response = test_client.post("/bills", headers=api_headers_bearer( user1_tokens["access_token"]["token"]), data=json.dumps(bill_data, default=json_data_encoder)) json_response = json.loads(response.get_data(as_text=True)) assert response.status_code == 400 assert json_response["message"] == "Sum of amounts must be zero" assert len(get_all_bills()) == 0
def test_get_only_not_removed_bills(test_client, api_headers_bearer, insert_tokens): password = "******" now = datetime.datetime.utcnow() user1 = User(first_name="Max", last_name="Muster", email="*****@*****.**", password=password) insert_user(user1) user1_tokens = insert_tokens(user1.email) user2 = User(first_name="Max", last_name="Muster", email="*****@*****.**", password=password) insert_user(user2) bill1 = Bill(description="Bill", members=[ BillMember(user=user1, amount="-2.00"), BillMember(user=user2, amount="2.00") ], date=now, date_created=now) insert_bill(bill1) bill2 = Bill(description="Bill", members=[ BillMember(user=user1, amount="-2.00"), BillMember(user=user2, amount="2.00") ], date=now, date_created=now, valid=False) insert_bill(bill2) response = test_client.get("/bills", headers=api_headers_bearer( user1_tokens["access_token"]["token"])) json_response = json.loads(response.get_data(as_text=True)) assert len(json_response["bills"]) == 1 assert json_response["bills"][0]["id"] == bill1.id
def test_error_on_password_wrong_type(test_client, api_headers): password = "******" user = User(email="*****@*****.**", password=password, first_name="Max", last_name="Muster") insert_user(user) data = {"email": user.email, "password": True} response = test_client.post("/tokens", headers=api_headers, data=json.dumps(data)) json_response = json.loads(response.get_data(as_text=True)) assert response.status_code == 400 assert "message" in json_response assert json_response[ "message"] == "Attribute password needs to be of type str"
def test_error_on_bill_not_existing(test_client, api_headers_bearer, insert_tokens): password = "******" now = datetime.datetime.utcnow() user1 = User(first_name="Max", last_name="Muster", email="*****@*****.**", confirmed=True, password=password) insert_user(user1) user1_tokens = insert_tokens(user1.email) user2 = User(first_name="Max", last_name="Muster", email="*****@*****.**", confirmed=True, password=password) insert_user(user2) bill_member1 = BillMember(user_id=user1.id, amount="5.00") bill_member2 = BillMember(user_id=user2.id, amount="-5.00") bill1 = Bill(description="Bill", date=now, date_created=now, members=[bill_member1, bill_member2]) bill_id = insert_bill(bill1).id data = {"description": "New"} response = test_client.put("/bills/2", headers=api_headers_bearer( user1_tokens["access_token"]["token"]), data=json.dumps(data)) json_response = json.loads(response.get_data(as_text=True)) bill = get_bill_by_id(bill_id) assert response.status_code == 400 assert json_response["message"] == "Bill does not exist" assert bill.description == "Bill"
def test_get_bills_from_group(test_client, api_headers_bearer, insert_tokens): password = "******" now = datetime.datetime.utcnow() user1 = User(first_name="Max", last_name="Muster", email="*****@*****.**", password=password) insert_user(user1) user1_tokens = insert_tokens(user1.email) user2 = User(first_name="Max", last_name="Muster", email="*****@*****.**", password=password) insert_user(user2) group = Group( name="Name", group_members=[GroupMember(user=user1), GroupMember(user=user2)]) insert_group(group) bill = Bill(description="Bill", date=now, date_created=now, group=group, members=[ BillMember(user=user1, amount=3), BillMember(user=user2, amount=-3) ]) insert_bill(bill) response = test_client.get("/groups/{}/bills".format(group.id), headers=api_headers_bearer( user1_tokens["access_token"]["token"])) json_response = json.loads(response.get_data(as_text=True)) assert response.status_code == 200 assert json_response["message"] == "Returned bills" assert len(json_response["bills"]) == 1 assert json_response["bills"][0]["id"] == bill.id
def test_create_group_with_not_registered_group_member_that_was_already_created(test_client, api_headers_bearer, insert_tokens): password = "******" user = User(first_name="Max", last_name="Muster", email="*****@*****.**", password=password) user = insert_user(user) tokens = insert_tokens(user.email) new_user_email = "*****@*****.**" insert_user(User(email=new_user_email)) group_data = { "name": "Muster", "members": [ { "id": user.id, }, { "email": new_user_email } ] } response = test_client.post("/groups", headers=api_headers_bearer( tokens["access_token"]["token"]), data=json.dumps(group_data)) json_response = json.loads(response.get_data(as_text=True)) assert response.status_code == 201 assert json_response["message"] == "Created new group" assert json_response["group"]["id"] == 1 assert json_response["group"]["name"] == group_data["name"] assert json_response["group"]["valid"] is True group = get_group_by_id(json_response["group"]["id"]) assert group is not None assert len(group.group_members) == 2
def test_dont_get_unknown_user_by_id(app): u = User(first_name="Max", last_name="Muster", email="*****@*****.**", password="******") u = insert_user(u) u_from_db = get_user_by_id(0) assert u_from_db is None
def _load_bill_data(json_data): check_has_not_attribute(json_data, "id") check_has_not_attribute(json_data, "valid") description = get_attribute(json_data, "description") date = get_attribute_if_existing(json_data, "date") date_created = get_attribute_if_existing(json_data, "date_created") group_id = get_attribute_if_existing(json_data, "group_id", ttype=int) members = get_attribute(json_data, "members", ttype=list) data = {} data["description"] = description if date is not None: data["date"] = convert_string_to_datetime(date) if date_created is not None: data["date_created"] = convert_string_to_datetime(date_created) if group_id is not None: data["group_id"] = group_id data["members"] = [] for member in members: member_id = get_attribute_if_existing(member, "user_id", ttype=int) if member_id is None: member_email = get_attribute(member, "email", ttype=str) user = get_user_by_email(member_email) if user is None: user = User(email=member_email) insert_user(user) member_id = user.id amount = get_attribute(member, "amount", ttype=int) data["members"].append({ "user_id": member_id, "amount": amount }) return data
def test_insert_friends_by_user_relationship(app): user1 = User(first_name="Max", last_name="Muster", email="*****@*****.**", password="******") insert_user(user1) user2 = User(first_name="Max", last_name="Muster", email="*****@*****.**", password="******") insert_user(user2) user3 = User(first_name="Max", last_name="Muster", email="*****@*****.**", password="******") insert_user(user3) user1.friends.append(Friend(friend=user2)) user1.friends.append(Friend(friend=user3)) friends_user1 = get_friends_by_user_id(user1.id) assert len(friends_user1) == 2 assert friends_user1[0].friend_id == user2.id assert friends_user1[1].friend_id == user3.id
def test_delete_existing_group(test_client, api_headers_bearer, insert_tokens): password = "******" now = datetime.datetime.utcnow() user1 = User(first_name="Max", last_name="Muster", email="*****@*****.**", password=password) insert_user(user1) user1_tokens = insert_tokens(user1.email) user2 = User(first_name="Max", last_name="Muster", email="*****@*****.**", password=password) insert_user(user2) group = Group(name="Name", group_members=[GroupMember(user=user1), GroupMember(user=user2)]) insert_group(group) bill_member1 = BillMember(user_id=user1.id, amount="5.00") bill_member2 = BillMember(user_id=user2.id, amount="-5.00") bill1 = Bill(description="Bill", group=group, date=now, date_created=now, members=[bill_member1, bill_member2]) insert_bill(bill1) assert group.valid is True response = test_client.delete("/groups/{}".format(group.id), headers=api_headers_bearer( user1_tokens["access_token"]["token"])) json_response = json.loads(response.get_data(as_text=True)) assert response.status_code == 200 assert json_response["message"] == "Deleted group" assert group.valid is False assert bill1.valid is False
def test_get_friends_by_user_id(app): user1 = User(first_name="Max", last_name="Muster", email="*****@*****.**", password="******") insert_user(user1) user2 = User(first_name="Max", last_name="Muster", email="*****@*****.**", password="******") insert_user(user2) user3 = User(first_name="Max", last_name="Muster", email="*****@*****.**", password="******") insert_user(user3) friend1 = Friend(user=user1, friend=user2) insert_friend(friend1) friend2 = Friend(user=user1, friend=user3) insert_friend(friend2) friends_user1 = get_friends_by_user_id(user1.id) assert len(friends_user1) == 2 assert friends_user1[0] == friend1 assert friends_user1[1] == friend2
def test_get_just_bills_from_user(app, test_client, api_headers_bearer, insert_tokens): password = "******" now = datetime.datetime.utcnow() user1 = User(first_name="Max", last_name="Muster", email="*****@*****.**", password=password) insert_user(user1) user1_tokens = insert_tokens(user1.email) user2 = User(first_name="Max", last_name="Muster", email="*****@*****.**", password=password) insert_user(user2) bill_member1 = BillMember(user_id=user1.id, amount="1.00") bill1 = Bill(description="Bill", date=now, date_created=now) insert_bill(bill1) bill_member1.bill = bill1 bill1.members.append(bill_member1) bill_member2 = BillMember(user_id=user2.id, amount="1.00") bill2 = Bill(description="Bill2", date=now, date_created=now) insert_bill(bill2) bill_member2.bill = bill2 response = test_client.get("/bills", headers=api_headers_bearer( user1_tokens["access_token"]["token"])) json_response = json.loads(response.get_data(as_text=True)) assert len(json_response["bills"]) == 1 assert json_response["bills"][0]["description"] == bill1.description
def test_add_new_member_to_group_add_member_as_friend_of_group_members( test_client, api_headers_bearer, insert_tokens): password = "******" user1 = User(first_name="Max", last_name="Muster", email="*****@*****.**", password=password) user1 = insert_user(user1) user1_tokens = insert_tokens(user1.email) user2 = User(first_name="Max", last_name="Muster", email="*****@*****.**", password=password) user2 = insert_user(user2) group_member1 = GroupMember(user=user1) group = Group(name="Muster", group_members=[group_member1]) insert_group(group) group_add_user_data = { "user_id": user2.id, } response = test_client.post("/groups/{}/members".format(group.id), headers=api_headers_bearer( user1_tokens["access_token"]["token"]), data=json.dumps(group_add_user_data)) assert response.status_code == 201 user1_friends = get_friends_by_user_id(user1.id) assert len(user1_friends) == 1 assert user1_friends[0].friend_id == user2.id assert len(user2.friends) == 1 assert user2.friends[0].friend_id == user1.id
def test_can_create_multiple_times_bill_with_same_members( test_client, api_headers_bearer, insert_tokens): now = datetime.datetime.utcnow() password = "******" user1 = User(first_name="Max", last_name="Muster", email="*****@*****.**", password=password) insert_user(user1) user1_tokens = insert_tokens(user1.email) user2 = User(first_name="Max", last_name="Muster", email="*****@*****.**", password=password) insert_user(user2) user3 = User(first_name="Max", last_name="Muster", email="*****@*****.**", password=password) insert_user(user3) bill_data = { "description": "Important bill", "date": datetime_to_string(now), "date_created": datetime_to_string(now), "members": [{ "user_id": user1.id, "amount": 200 }, { "user_id": user2.id, "amount": -100 }, { "user_id": user3.id, "amount": -100 }] } # Create bill first time response = test_client.post("/bills", headers=api_headers_bearer( user1_tokens["access_token"]["token"]), data=json.dumps(bill_data)) assert response.status_code == 201 # Create bill second time response = test_client.post("/bills", headers=api_headers_bearer( user1_tokens["access_token"]["token"]), data=json.dumps(bill_data)) assert response.status_code == 201
def test_get_only_non_removed_groups(test_client, api_headers_bearer, insert_tokens): password = "******" user1 = User(first_name="Max", last_name="Muster", email="*****@*****.**", password=password) insert_user(user1) tokens = insert_tokens(user1.email) group1 = Group(name="G1", group_members=[GroupMember(user=user1)]) insert_group(group1) group2 = Group( name="G1", group_members=[GroupMember(user=user1)], valid=False) insert_group(group2) response = test_client.get("/groups", headers=api_headers_bearer( tokens["access_token"]["token"])) json_respone = json.loads(response.get_data(as_text=True)) assert len(json_respone["groups"]) == 1 assert json_respone["groups"][0]["id"] == group1.id
def test_error_on_not_existing_group(test_client, api_headers_bearer, insert_tokens): password = "******" user = User(first_name="Max", last_name="Muster", email="*****@*****.**", password=password) insert_user(user) tokens = insert_tokens(user.email) data = { "id": 1, "name": "Changed", "members": [{"id": user.id}] } response = test_client.put("/groups/1", headers=api_headers_bearer( tokens["access_token"]["token"]), data=json.dumps(data)) json_response = json.loads(response.get_data(as_text=True)) assert response.status_code == 401 assert json_response["message"] == "Group does not exist"
def test_group_member_is_allowed_to_modify_bill(test_client, api_headers_bearer, insert_tokens): password = "******" now = datetime.datetime.utcnow() user1 = User(first_name="Max", last_name="Muster", email="*****@*****.**", confirmed=True, password=password) insert_user(user1) user2 = User(first_name="Max", last_name="Muster", email="*****@*****.**", confirmed=True, password=password) insert_user(user2) user3 = User(first_name="Max", last_name="Muster", email="*****@*****.**", confirmed=True, password=password) insert_user(user3) user3_tokens = insert_tokens(user3.email) group = Group( name="Group", group_members=[GroupMember(user=user1), GroupMember(user=user3)]) insert_group(group) bill_member1 = BillMember(user_id=user1.id, amount="5.00") bill_member2 = BillMember(user_id=user2.id, amount="-5.00") bill1 = Bill(description="Bill", date=now, date_created=now, group=group, members=[bill_member1, bill_member2]) bill_id = insert_bill(bill1).id data = {"description": "New"} response = test_client.put("/bills/{}".format(bill_id), headers=api_headers_bearer( user3_tokens["access_token"]["token"]), data=json.dumps(data)) json_response = json.loads(response.get_data(as_text=True)) bill = get_bill_by_id(bill_id) assert response.status_code == 200 assert json_response["message"] == "Updated bill" assert bill.description == data["description"]
def test_create_bill_with_not_registered_bill_member_that_was_already_created( test_client, api_headers_bearer, insert_tokens): password = "******" now = datetime.datetime.utcnow() user1 = User(first_name="Max", last_name="Muster", email="*****@*****.**", password=password) insert_user(user1) user1_tokens = insert_tokens(user1.email) user2 = User(first_name="Max", last_name="Muster", email="*****@*****.**", password=password) insert_user(user2) new_user_email = "*****@*****.**" insert_user(User(email=new_user_email)) bill_data = { "description": "Important bill", "date": datetime_to_string(now), "date_created": datetime_to_string(now), "members": [{ "user_id": user1.id, "amount": 200 }, { "user_id": user2.id, "amount": -100 }, { "email": new_user_email, "amount": -100 }] } response = test_client.post("/bills", headers=api_headers_bearer( user1_tokens["access_token"]["token"]), data=json.dumps(bill_data, default=json_data_encoder)) json_response = json.loads(response.get_data(as_text=True)) assert response.status_code == 201 bill = get_bills_by_user_id(user1.id)[0] assert json_response["message"] == "Created new bill" assert len(get_bills_by_user_id(user1.id)) == 1 assert len(get_bills_by_user_id(user2.id)) == 1 assert len(bill.members) == 3
def test_unrevoke_access_token(test_client, api_headers, api_headers_bearer): password = "******" user = User(email="*****@*****.**", password=password, first_name="Max", last_name="Muster") insert_user(user) data = {"email": user.email, "password": password} response = test_client.post("/tokens", headers=api_headers, data=json.dumps(data)) json_response = json.loads(response.get_data(as_text=True)) access_token = json_response["access_token"] response = test_client.post("/tokens", headers=api_headers, data=json.dumps(data)) json_response = json.loads(response.get_data(as_text=True)) second_access_token = json_response["access_token"] revoke_token(access_token["id"], user.email) data = {"revoke": False} response = test_client.put("/tokens/{}".format(access_token["id"]), headers=api_headers_bearer( second_access_token["token"]), data=json.dumps(data)) json_response = json.loads(response.get_data(as_text=True)) assert response.status_code == 200 assert json_response["message"] == "Token unrevoked" assert is_token_revoked(decode_token(access_token["token"])) is False
def test_add_unregistered_member_to_bill_that_was_already_created( test_client, api_headers_bearer, insert_tokens): password = "******" now = datetime.datetime.utcnow() user1 = User(first_name="Max", last_name="Muster", email="*****@*****.**", confirmed=True, password=password) insert_user(user1) user1_tokens = insert_tokens(user1.email) user2 = User(first_name="Max", last_name="Muster", email="*****@*****.**", confirmed=True, password=password) insert_user(user2) new_user_email = "*****@*****.**" insert_user(User(email=new_user_email)) bill_member1 = BillMember(user_id=user1.id, amount="5.00") bill_member2 = BillMember(user_id=user2.id, amount="-5.00") bill1 = Bill(description="Bill", date=now, date_created=now, members=[bill_member1, bill_member2]) bill_id = insert_bill(bill1).id data = { "members": [{ "user_id": user1.id, "amount": -3 }, { "user_id": user2.id, "amount": -3 }, { "email": new_user_email, "amount": 6 }] } response = test_client.put("/bills/{}".format(bill_id), headers=api_headers_bearer( user1_tokens["access_token"]["token"]), data=json.dumps(data)) json_response = json.loads(response.get_data(as_text=True)) bill = get_bill_by_id(bill_id) assert response.status_code == 200 assert json_response["message"] == "Updated bill" assert len(bill.members) == 3