def test_crud(self): """Basic CRUD tests.""" # create a user harness.create_user(name='snakes') # no quest yet, so 404 resp = self.app.get("/v1/organizations/1") self.assertEqual(resp.status_code, 404) # create an org resp = self.post_json( self.url_for(backend.organization_views.OrganizationList), {"name": "hotel", "description": "cat hotel house"}) self.assertEqual(resp.status_code, 200) # and get it back resp = self.app.get("/v1/organizations/1") self.assertEqual(json.loads(resp.data), { "description": "cat hotel house", "icon_url": None, "id": 1, "members": [], "name": "hotel", "url": "/v1/organizations/1", "creator_url": "/v1/users/1", "creator_id": 1}) # edit resp = self.put_json('/v1/organizations/1', { 'name': 'hotel', 'description': 'cat hotel house', 'icon_url': 'rubber'}) self.assertEqual(resp.status_code, 200) # and get it back resp = self.app.get("/v1/organizations/1") self.assertEqual(json.loads(resp.data), { "description": "cat hotel house", "icon_url": 'rubber', "id": 1, "members": [], "name": "hotel", "url": "/v1/organizations/1", "creator_url": "/v1/users/1", "creator_id": 1}) # delete resp = self.app.delete("/v1/organizations/1") self.assertEqual(resp.status_code, 200) # and it's gone resp = self.app.get("/v1/organizations/1") self.assertEqual(resp.status_code, 404) resp = self.put_json('/v1/organizations/1', { 'name': 'hotel', 'description': 'cat hotel house', 'icon_url': 'rubber'}) self.assertEqual(resp.status_code, 404) resp = self.app.delete("/v1/organizations/1") self.assertEqual(resp.status_code, 404)
def test_links(self): """Test links between quests and missions.""" # create the resources harness.create_user(name='snakes') resp = self.post_json( self.url_for(backend.quest_views.QuestList), {"name": "mouse", "summary": "nip"}) self.assertEqual(resp.status_code, 200) resp = self.post_json( self.url_for(backend.quest_views.QuestList), {"name": "blouse", "summary": "blip"}) self.assertEqual(resp.status_code, 200) resp = self.post_json( self.url_for(backend.mission_views.MissionList), {"name": "hat", "description": "snap", "points": 2}) self.assertEqual(resp.status_code, 200) resp = self.post_json( self.url_for(backend.mission_views.MissionList), {"name": "cat", "description": "map", "points": 1}) self.assertEqual(resp.status_code, 200) resp = self.app.put("/v1/missions/1/quests/1") self.assertEqual(resp.status_code, 200) resp = self.app.put("/v1/missions/1/quests/2") self.assertEqual(resp.status_code, 200) resp = self.app.put("/v1/missions/2/quests/1") self.assertEqual(resp.status_code, 200) resp = self.app.get("/v1/missions/1") self.assertEqual(json.loads(resp.data), { "description": "snap", "id": 1, "name": "hat", "points": 2, "url": "/v1/missions/1", "creator_id": 1, "creator_url": "/v1/users/1", "quests": [ {"summary": "nip", "icon_url": None, "id": 1, "url": "/v1/quests/1", "creator_url": "/v1/users/1", "name": "mouse", "creator_id": 1}, {"summary": "blip", "icon_url": None, "id": 2, "url": "/v1/quests/2", "creator_url": "/v1/users/1", "name": "blouse", "creator_id": 1}]}) resp = self.app.get("/v1/missions/2") self.assertEqual(json.loads(resp.data), { "name": "cat", "description": "map", "points": 1, "id": 2, "url": "/v1/missions/2", "creator_id": 1, "creator_url": "/v1/users/1", "quests": [ {"summary": "nip", "icon_url": None, "id": 1, "url": "/v1/quests/1", "creator_url": "/v1/users/1", "name": "mouse", "creator_id": 1}]})
def test_crud(self): """Basic CRUD tests.""" # no users yet, so 404 resp = self.app.get("/v1/users/1") self.assertEqual(resp.status_code, 404) # create a user harness.create_user(name='snakes', avatar_url='snakes.png') # and get it back resp = self.app.get("/v1/users/1") self.assertEqual(json.loads(resp.data), { 'avatar_url': "snakes.png", 'id': 1, 'organizations': [], 'url': '/v1/users/1', 'name': 'snakes'}) # edit the user resp = self.put_json('/v1/users/1', { 'name': 'hat hotel', 'avatar_url': "ladders.png"}) self.assertEqual(resp.status_code, 200) # and get it back resp = self.app.get("/v1/users/1") self.assertEqual(json.loads(resp.data), { 'name': 'hat hotel', 'avatar_url': "ladders.png", 'organizations': [], 'id': 1, 'url': '/v1/users/1'}) # delete the user resp = self.app.delete("/v1/users/1") self.assertEqual(resp.status_code, 200) # and it's gone resp = self.app.get("/v1/users/1") self.assertEqual(resp.status_code, 404) resp = self.put_json('/v1/users/1', { 'name': 'ladders', 'organization': 'hat hotel'}) self.assertEqual(resp.status_code, 404) resp = self.app.delete("/v1/users/1") self.assertEqual(resp.status_code, 404)
def test_links(self): """Test linking users and organizations together.""" # create the resources harness.create_user(name='snakes', avatar_url='snakes.png') harness.create_user(name='rakes', avatar_url='rakes.png') resp = self.post_json( self.url_for(backend.organization_views.OrganizationList), {"name": "mouse", "description": "nip"}) self.assertEqual(resp.status_code, 200) resp = self.post_json( self.url_for(backend.organization_views.OrganizationList), {"name": "blouse", "description": "blip"}) self.assertEqual(resp.status_code, 200) # no links yet resp = self.app.get("/v1/organizations/1") self.assertEqual(resp.status_code, 200) self.assertEqual(json.loads(resp.data)['members'], []) resp = self.app.get("/v1/organizations/2") self.assertEqual(resp.status_code, 200) self.assertEqual(json.loads(resp.data)['members'], []) # create some links resp = self.app.put("/v1/organizations/1/users/1") self.assertEqual(resp.status_code, 200) resp = self.app.put("/v1/organizations/1/users/2") self.assertEqual(resp.status_code, 200) resp = self.app.put("/v1/organizations/2/users/2") self.assertEqual(resp.status_code, 200) # see the links on the organizations resp = self.app.get("/v1/organizations/1") self.assertEqual(json.loads(resp.data)['members'], [ {"id": 1, "name": "snakes", "url": "/v1/users/1", "avatar_url": 'snakes.png'}, {"id": 2, "name": "rakes", "url": "/v1/users/2", "avatar_url": 'rakes.png'}]) resp = self.app.get("/v1/organizations/2") self.assertEqual(json.loads(resp.data)['members'], [ {"id": 2, "name": "rakes", "url": "/v1/users/2", "avatar_url": 'rakes.png'}]) # and on the users resp = self.app.get("/v1/users/1") self.assertEqual(json.loads(resp.data)['organizations'], [ {'id': 1, 'name': 'mouse', 'icon_url': None, 'url': '/v1/organizations/1'}]) resp = self.app.get("/v1/users/2") self.assertEqual(json.loads(resp.data)['organizations'], [ {'id': 1, 'name': 'mouse', 'icon_url': None, 'url': '/v1/organizations/1'}, {'id': 2, 'name': 'blouse', 'icon_url': None, 'url': '/v1/organizations/2'}]) # check idempotency resp = self.app.put("/v1/organizations/1/users/1") self.assertEqual(resp.status_code, 200) resp = self.app.get("/v1/organizations/1") self.assertEqual(json.loads(resp.data)['members'], [ {"id": 1, "name": "snakes", "url": "/v1/users/1", "avatar_url": 'snakes.png'}, {"id": 2, "name": "rakes", "url": "/v1/users/2", "avatar_url": 'rakes.png'}]) resp = self.app.get("/v1/organizations/2") self.assertEqual(json.loads(resp.data)['members'], [ {"id": 2, "name": "rakes", "url": "/v1/users/2", "avatar_url": 'rakes.png'}]) # delete a link resp = self.app.delete("/v1/organizations/1/users/2") self.assertEqual(resp.status_code, 200) # and it's gone resp = self.app.get("/v1/organizations/1") self.assertEqual(json.loads(resp.data)['members'], [ {"id": 1, "name": "snakes", "url": "/v1/users/1", "avatar_url": 'snakes.png'}]) resp = self.app.get("/v1/organizations/2") self.assertEqual(json.loads(resp.data)['members'], [ {"id": 2, "name": "rakes", "url": "/v1/users/2", "avatar_url": 'rakes.png'}])
def test_crud(self): """Basic CRUD tests.""" # no mission yet, so 404 resp = self.app.get("/v1/missions/1") self.assertEqual(resp.status_code, 404) # create a user and some missions harness.create_user(name='snakes') resp = self.post_json( self.url_for(backend.mission_views.MissionList), {"name": "snakes", "description": "ladders", "points": 3}) self.assertEqual(resp.status_code, 200) resp = self.post_json( self.url_for(backend.mission_views.MissionList), {"name": "happy", "description": "socks", "points": 1}) self.assertEqual(json.loads(resp.data), { "description": "socks", "id": 2, "name": "happy", "points": 1, "url": "/v1/missions/2", "quests": [], "creator_url": "/v1/users/1", "creator_id": 1}) self.assertEqual(resp.status_code, 200) # and get it back resp = self.app.get("/v1/missions/1") self.assertEqual(json.loads(resp.data), { 'points': 3, "creator_url": "/v1/users/1", 'creator_id': 1, 'description': 'ladders', 'name': 'snakes', 'url': '/v1/missions/1', "quests": [], 'id': 1}) # edit resp = self.put_json('/v1/missions/1', { 'name': 'cat', 'description': 'hat', 'points': 3}) self.assertEqual(resp.status_code, 200) # and get it back resp = self.app.get("/v1/missions/1") self.assertEqual(json.loads(resp.data), { 'points': 3, "creator_url": "/v1/users/1", 'creator_id': 1, 'description': 'hat', 'name': 'cat', 'url': '/v1/missions/1', "quests": [], 'id': 1}) # list them resp = self.app.get(self.url_for( backend.mission_views.MissionUserList, user_id=1)) self.assertItemsEqual(json.loads(resp.data)['missions'], [ {'points': 3, 'creator_id': 1, 'description': 'hat', 'quests': [], "creator_url": "/v1/users/1", 'name': 'cat', 'id': 1, 'url': '/v1/missions/1'}, {'points': 1, 'creator_id': 1, 'description': 'socks', 'quests': [], "creator_url": "/v1/users/1", 'name': 'happy', 'id': 2, 'url': '/v1/missions/2'}]) # delete resp = self.app.delete("/v1/missions/1") self.assertEqual(resp.status_code, 200) # and it's gone resp = self.app.get("/v1/missions/1") self.assertEqual(resp.status_code, 404) resp = self.put_json('/v1/missions/1', { 'name': 'cat', 'description': 'hat', 'points': 3}) self.assertEqual(resp.status_code, 404) resp = self.app.delete("/v1/missions/1") self.assertEqual(resp.status_code, 404)
def multiple_choice_test(self): """Test the multiple choice resource.""" # nothing, so 404 resp = self.app.get(self.url_for( backend.question_views.MultipleChoice, question_id=1, multiple_choice_id=1)) self.assertEqual(resp.status_code, 404) # create our resources harness.create_user(name='snakes') resp = self.post_json( self.url_for(backend.quest_views.QuestList), {"name": "mouse", "summary": "nap"}) self.assertEqual(resp.status_code, 200) resp = self.post_json( self.url_for(backend.question_views.QuestionList, parent_id=1), {'description': 'q1', 'question_type': 'multiple_choice', 'question_group': 'review_quiz'}) self.assertEqual(resp.status_code, 200) resp = self.post_json( self.url_for(backend.question_views.QuestionList, parent_id=1), {'description': 'q2', 'question_type': 'text', 'question_group': 'review_quiz'}) self.assertEqual(resp.status_code, 200) resp = self.post_json( self.url_for( backend.question_views.MultipleChoiceList, parent_id=1), {'answer': 'a', 'is_correct': False, 'order': 2}) self.assertEqual(json.loads(resp.data), { "answer": "a", "is_correct": False, 'order': 2, "id": 1, "url": "/v1/questions/1/multiple_choices/1", "creator_id": 1, "creator_url": "/v1/users/1", "question_id": 1, "question_url": "/v1/questions/1"}) resp = self.post_json( self.url_for( backend.question_views.MultipleChoiceList, parent_id=1), {'answer': 'b', 'is_correct': True, 'order': 1}) self.assertEqual(json.loads(resp.data), { "answer": "b", "is_correct": True, 'order': 1, "id": 2, "url": "/v1/questions/1/multiple_choices/2", "creator_id": 1, "creator_url": "/v1/users/1", "question_id": 1, "question_url": "/v1/questions/1"}) # can't add a multiple choice answer to a non-multiple choice question resp = self.post_json( self.url_for( backend.question_views.MultipleChoiceList, parent_id=2), {'answer': 'a', 'is_correct': False, 'order': 3}) self.assertEqual(resp.status_code, 400) # or link to a non-existant question resp = self.post_json( self.url_for( backend.question_views.MultipleChoiceList, parent_id=20), {'answer': 'a', 'is_correct': False, 'order': 3}) self.assertEqual(resp.status_code, 404) # edit resp = self.put_json( self.url_for( backend.question_views.MultipleChoice, question_id=1, multiple_choice_id=2), {'answer': 'bee', 'is_correct': True, 'order': 1}) self.assertEqual(resp.status_code, 200) resp = self.app.get( self.url_for( backend.question_views.MultipleChoice, question_id=1, multiple_choice_id=2)) self.assertEqual(json.loads(resp.data), { "answer": "bee", "is_correct": True, 'order': 1, "id": 2, "url": "/v1/questions/1/multiple_choices/2", "creator_id": 1, "creator_url": "/v1/users/1", "question_id": 1, "question_url": "/v1/questions/1"}) # see them get attached to a question resp = self.app.get( self.url_for( backend.question_views.Question, quest_id=1, question_id=1)) self.assertEqual(json.loads(resp.data)['multiple_choices'], [ {"answer": "bee", "is_correct": True, 'order': 1, "id": 2, "url": "/v1/questions/1/multiple_choices/2", "creator_id": 1, "creator_url": "/v1/users/1", "question_id": 1, "question_url": "/v1/questions/1"}, {"answer": "a", "is_correct": False, 'order': 2, "id": 1, "url": "/v1/questions/1/multiple_choices/1", "creator_id": 1, "creator_url": "/v1/users/1", "question_id": 1, "question_url": "/v1/questions/1"}]) resp = self.app.get( self.url_for( backend.question_views.MultipleChoiceList, parent_id=1)) self.assertEqual(json.loads(resp.data), {'multiple_choices': [ {"answer": "bee", "is_correct": True, 'order': 1, "id": 2, "url": "/v1/questions/1/multiple_choices/2", "creator_id": 1, "creator_url": "/v1/users/1", "question_id": 1, "question_url": "/v1/questions/1"}, {"answer": "a", "is_correct": False, 'order': 2, "id": 1, "url": "/v1/questions/1/multiple_choices/1", "creator_id": 1, "creator_url": "/v1/users/1", "question_id": 1, "question_url": "/v1/questions/1"}]}) # make sure order is respected resp = self.put_json( self.url_for( backend.question_views.MultipleChoice, question_id=1, multiple_choice_id=2), {'answer': 'bee', 'is_correct': True, 'order': 3}) self.assertEqual(resp.status_code, 200) resp = self.app.get( self.url_for( backend.question_views.Question, quest_id=1, question_id=1)) self.assertEqual(json.loads(resp.data)['multiple_choices'], [ {"answer": "a", "is_correct": False, 'order': 2, "id": 1, "url": "/v1/questions/1/multiple_choices/1", "creator_id": 1, "creator_url": "/v1/users/1", "question_id": 1, "question_url": "/v1/questions/1"}, {"answer": "bee", "is_correct": True, 'order': 3, "id": 2, "url": "/v1/questions/1/multiple_choices/2", "creator_id": 1, "creator_url": "/v1/users/1", "question_id": 1, "question_url": "/v1/questions/1"}]) # delete resp = self.app.delete( self.url_for( backend.question_views.MultipleChoice, question_id=1, multiple_choice_id=2)) self.assertEqual(resp.status_code, 200) resp = self.app.get( self.url_for( backend.question_views.Question, quest_id=1, question_id=1)) self.assertEqual(json.loads(resp.data)['multiple_choices'], [ {"answer": "a", "is_correct": False, 'order': 2, "id": 1, "url": "/v1/questions/1/multiple_choices/1", "creator_id": 1, "creator_url": "/v1/users/1", "question_id": 1, "question_url": "/v1/questions/1"}]) resp = self.app.get( self.url_for( backend.question_views.MultipleChoice, question_id=1, multiple_choice_id=2)) self.assertEqual(resp.status_code, 404)
def test_answer_crud(self): """Test CRUD on answer resources.""" # create a user harness.create_user(name='snakes') # create a quest resp = self.post_json( self.url_for(backend.quest_views.QuestList), {"name": "mouse", "summary": "nap"}) self.assertEqual(resp.status_code, 200) # create some questions resp = self.post_json( self.url_for(backend.question_views.QuestionList, parent_id=1), {"question_type": "text", "description": "cat hotel", 'question_group': 'review_quiz'}) self.assertEqual(resp.status_code, 200) resp = self.post_json( self.url_for(backend.question_views.QuestionList, parent_id=1), {"question_type": "upload", "description": "cat upload", 'question_group': 'review_quiz'}) self.assertEqual(resp.status_code, 200) resp = self.post_json( self.url_for(backend.question_views.QuestionList, parent_id=1), {"question_type": "multiple_choice", "description": "a choice", 'question_group': 'review_quiz'}) self.assertEqual(resp.status_code, 200) resp = self.post_json( self.url_for(backend.question_views.QuestionList, parent_id=1), {"question_type": "multiple_choice", "description": "b choice", 'question_group': 'review_quiz'}) self.assertEqual(resp.status_code, 200) # create some choices resp = self.post_json( self.url_for( backend.question_views.MultipleChoiceList, parent_id=3), {'answer': 'a', 'is_correct': True, 'order': 1}) self.assertEqual(resp.status_code, 200) resp = self.post_json( self.url_for( backend.question_views.MultipleChoiceList, parent_id=3), {'answer': 'b', 'is_correct': False, 'order': 2}) self.assertEqual(resp.status_code, 200) resp = self.post_json( self.url_for( backend.question_views.MultipleChoiceList, parent_id=4), {'answer': 'a', 'is_correct': False, 'order': 2}) self.assertEqual(resp.status_code, 200) # link some answers resp = self.post_json( self.url_for(backend.question_views.AnswerList, parent_id=1), {"answer_text": "cats"}) self.assertEqual(json.loads(resp.data), { "question_type": "text", "answer_text": "cats", "answer_multiple_choice": None, "answer_upload_url": None, "id": 1, "url": "/v1/questions/1/answers/1", "creator_id": 1, "creator_url": "/v1/users/1", "question_id": 1, "question_url": "/v1/questions/1"}) resp = self.post_json( self.url_for(backend.question_views.AnswerList, parent_id=1), {"answer_text": "more cats"}) self.assertEqual(json.loads(resp.data), { "question_type": "text", "answer_text": "more cats", "answer_multiple_choice": None, "answer_upload_url": None, "id": 2, "url": "/v1/questions/1/answers/2", "creator_id": 1, "creator_url": "/v1/users/1", "question_id": 1, "question_url": "/v1/questions/1"}) resp = self.post_json( self.url_for(backend.question_views.AnswerList, parent_id=3), {"answer_multiple_choice": 1}) self.assertEqual(json.loads(resp.data), { "question_type": "multiple_choice", "answer_text": None, "answer_multiple_choice": 1, "answer_upload_url": None, "id": 3, "url": "/v1/questions/3/answers/3", "creator_id": 1, "creator_url": "/v1/users/1", "question_id": 3, "question_url": "/v1/questions/3"}) # multiple choice id 1 is linked to question 3, not 4 resp = self.post_json( self.url_for(backend.question_views.AnswerList, parent_id=4), {"answer_multiple_choice": 3}) self.assertEqual(resp.status_code, 200) resp = self.post_json( self.url_for(backend.question_views.AnswerList, parent_id=4), {"answer_multiple_choice": 1}) self.assertEqual(resp.status_code, 404) resp = self.put_json( "/v1/questions/4/answers/4", {"answer_multiple_choice": 1}) self.assertEqual(resp.status_code, 404) # non-existant multiple choice id 70 resp = self.post_json( self.url_for(backend.question_views.AnswerList, parent_id=3), {"answer_multiple_choice": 70}) self.assertEqual(resp.status_code, 404) # 400 on invalid combinations of question_type and answer fields resp = self.post_json( self.url_for(backend.question_views.AnswerList, parent_id=1), {"answer_upload_url": "cats.html"}) self.assertEqual(resp.status_code, 400) resp = self.post_json( self.url_for(backend.question_views.AnswerList, parent_id=1), {"answer_multiple_choice": "cats"}) self.assertEqual(resp.status_code, 400) resp = self.post_json( self.url_for(backend.question_views.AnswerList, parent_id=2), {"answer_text": "cats"}) self.assertEqual(resp.status_code, 400) resp = self.post_json( self.url_for(backend.question_views.AnswerList, parent_id=2), {"answer_multiple_choice": "cats"}) self.assertEqual(resp.status_code, 400) resp = self.post_json( self.url_for(backend.question_views.AnswerList, parent_id=3), {"answer_text": "cats"}) self.assertEqual(resp.status_code, 400) resp = self.post_json( self.url_for(backend.question_views.AnswerList, parent_id=3), {"answer_upload_url": "cats"}) self.assertEqual(resp.status_code, 400) # get them back resp = self.app.get('/v1/questions/1/answers/2') self.assertEqual(json.loads(resp.data), { "question_type": "text", "answer_text": "more cats", "answer_upload_url": None, "answer_multiple_choice": None, "id": 2, "url": "/v1/questions/1/answers/2", "creator_id": 1, "creator_url": "/v1/users/1", "question_id": 1, "question_url": "/v1/questions/1"}) resp = self.app.get(self.url_for( backend.question_views.AnswerList, parent_id=1)) self.assertEqual(json.loads(resp.data)['answers'], [ {"answer_text": "cats", "answer_upload_url": None, "creator_id": 1, "creator_url": "/v1/users/1", "answer_multiple_choice": None, "id": 1, "question_id": 1, "question_type": "text", "question_url": "/v1/questions/1", "url": "/v1/questions/1/answers/1"}, {"answer_text": "more cats", "answer_upload_url": None, "creator_id": 1, "creator_url": "/v1/users/1", "id": 2, "answer_multiple_choice": None, "question_id": 1, "question_type": "text", "question_url": "/v1/questions/1", "url": "/v1/questions/1/answers/2"}]) # edit resp = self.put_json('/v1/questions/1/answers/2', { "question_type": "text", "answer_text": "super cat"}) self.assertEqual(resp.status_code, 200) resp = self.app.get('/v1/questions/1/answers/2') self.assertEqual(json.loads(resp.data), { "question_type": "text", "answer_text": "super cat", "answer_upload_url": None, "answer_multiple_choice": None, "id": 2, "url": "/v1/questions/1/answers/2", "creator_id": 1, "creator_url": "/v1/users/1", "question_id": 1, "question_url": "/v1/questions/1"}) # delete resp = self.app.delete('/v1/questions/1/answers/2') self.assertEqual(resp.status_code, 200) resp = self.app.get('/v1/questions/1/answers/2') self.assertEqual(resp.status_code, 404) # bad question_id / answer_id combos 404 resp = self.app.get('/v1/questions/1/answers/1') self.assertEqual(resp.status_code, 200) resp = self.app.get('/v1/questions/100/answers/1') self.assertEqual(resp.status_code, 404) resp = self.app.put('/v1/questions/100/answers/1') self.assertEqual(resp.status_code, 404) resp = self.app.delete('/v1/questions/100/answers/1') self.assertEqual(resp.status_code, 404) resp = self.app.get(self.url_for( backend.question_views.AnswerList, parent_id=100)) self.assertEqual(resp.status_code, 404)
def test_crud(self): """Basic CRUD tests.""" # create a user harness.create_user(name='snakes') # create a quest resp = self.post_json( self.url_for(backend.quest_views.QuestList), {"name": "mouse", "summary": "nap"}) self.assertEqual(resp.status_code, 200) # no questions yet resp = self.app.get("/v1/quests/1/questions/1") self.assertEqual(resp.status_code, 404) resp = self.app.get(self.url_for( backend.question_views.QuestionList, parent_id=1)) self.assertEqual(json.loads(resp.data)['questions'], []) # create a resource resp = self.post_json( self.url_for(backend.question_views.QuestionList, parent_id=1), {"question_type": "text", "description": "cat hotel", 'question_group': 'lab_report'}) self.assertEqual(json.loads(resp.data), { "multiple_choices": [],'question_group': 'lab_report', "description": "cat hotel", "question_type": "text", "id": 1, "url": "/v1/quests/1/questions/1", "creator_id": 1, "creator_url": "/v1/users/1", "quest_id": 1, "quest_url": "/v1/quests/1"}) # or two resp = self.post_json( self.url_for(backend.question_views.QuestionList, parent_id=1), {"question_type": "upload", "description": "snake farm", 'question_group': 'review_quiz'}) self.assertEqual(json.loads(resp.data), { "multiple_choices": [],'question_group': 'review_quiz', "description": "snake farm", "question_type": "upload", "id": 2, "url": "/v1/quests/1/questions/2", "creator_id": 1, "creator_url": "/v1/users/1", "quest_id": 1, "quest_url": "/v1/quests/1"}) # and one more linked to a different quest resp = self.post_json( self.url_for(backend.quest_views.QuestList), {"name": "mouse", "summary": "nap"}) self.assertEqual(resp.status_code, 200) resp = self.post_json( self.url_for(backend.question_views.QuestionList, parent_id=2), {"question_type": "upload", "description": "snake farm", 'question_group': 'closing_questions'}) self.assertEqual(resp.status_code, 200) # can't create a question with a bad question_group resp = self.post_json( self.url_for(backend.question_views.QuestionList, parent_id=2), {"question_type": "upload", "description": "snake farm", 'question_group': 'snakes'}) self.assertEqual(resp.status_code, 400) # and get them back resp = self.app.get("/v1/quests/1/questions/1") self.assertEqual(json.loads(resp.data), { "multiple_choices": [], 'question_group': 'lab_report', "description": "cat hotel", "question_type": "text", "id": 1, "url": "/v1/quests/1/questions/1", "creator_id": 1, "creator_url": "/v1/users/1", "quest_id": 1, "quest_url": "/v1/quests/1"}) resp = self.app.get("/v1/quests/1/questions/2") self.assertEqual(resp.status_code, 200) resp = self.app.get(self.url_for( backend.question_views.QuestionList, parent_id=1)) self.assertEqual(json.loads(resp.data)['questions'], [ {"description": "cat hotel", "question_type": "text", "id": 1, "url": "/v1/quests/1/questions/1", "creator_id": 1, "creator_url": "/v1/users/1", "multiple_choices": [], 'question_group': 'lab_report', "quest_id": 1, "quest_url": "/v1/quests/1"}, {"description": "snake farm", "question_type": "upload", "id": 2, "url": "/v1/quests/1/questions/2", "creator_id": 1, "creator_url": "/v1/users/1", "multiple_choices": [], 'question_group': 'review_quiz', "quest_id": 1, "quest_url": "/v1/quests/1"}]) resp = self.app.get(self.url_for( backend.question_views.QuestionList, parent_id=100)) self.assertEqual(resp.status_code, 404) # filter by question_group resp = self.app.get(self.url_for( backend.question_views.QuestionList, parent_id=1, question_group='lab_report')) self.assertEqual(json.loads(resp.data)['questions'], [ {"description": "cat hotel", "question_type": "text", "id": 1, "url": "/v1/quests/1/questions/1", "creator_id": 1, "creator_url": "/v1/users/1", "multiple_choices": [], 'question_group': 'lab_report', "quest_id": 1, "quest_url": "/v1/quests/1"}]) resp = self.app.get(self.url_for( backend.question_views.QuestionList, parent_id=1, question_group='lab_report,closing_questions')) self.assertEqual(json.loads(resp.data)['questions'], [ {"description": "cat hotel", "question_type": "text", "id": 1, "url": "/v1/quests/1/questions/1", "creator_id": 1, "creator_url": "/v1/users/1", "multiple_choices": [], 'question_group': 'lab_report', "quest_id": 1, "quest_url": "/v1/quests/1"}]) resp = self.app.get(self.url_for( backend.question_views.QuestionList, parent_id=1, question_group='lab_report,review_quiz')) self.assertEqual(json.loads(resp.data)['questions'], [ {"description": "cat hotel", "question_type": "text", "id": 1, "url": "/v1/quests/1/questions/1", "creator_id": 1, "creator_url": "/v1/users/1", "multiple_choices": [], 'question_group': 'lab_report', "quest_id": 1, "quest_url": "/v1/quests/1"}, {"description": "snake farm", "question_type": "upload", "id": 2, "url": "/v1/quests/1/questions/2", "creator_id": 1, "creator_url": "/v1/users/1", "multiple_choices": [], 'question_group': 'review_quiz', "quest_id": 1, "quest_url": "/v1/quests/1"}]) resp = self.app.get(self.url_for( backend.question_views.QuestionList, parent_id=100, question_group='lab_report')) self.assertEqual(resp.status_code, 404) # error on bad question group resp = self.app.get(self.url_for( backend.question_views.QuestionList, parent_id=1, question_group='lab_report,snakes')) self.assertEqual(resp.status_code, 400) # and get them back with just the id resp = self.app.get("/v1/questions/1") self.assertEqual(json.loads(resp.data), { "description": "cat hotel", "question_type": "text", "id": 1, "url": "/v1/quests/1/questions/1", "creator_id": 1, "creator_url": "/v1/users/1", "multiple_choices": [], 'question_group': 'lab_report', "quest_id": 1, "quest_url": "/v1/quests/1"}) # but can't do anything else with that URI resp = self.app.post("/v1/questions/1") self.assertEqual(resp.status_code, 405) resp = self.app.put("/v1/questions/1") self.assertEqual(resp.status_code, 405) resp = self.app.delete("/v1/questions/1") self.assertEqual(resp.status_code, 405) # edit resp = self.put_json('/v1/quests/1/questions/1', { "question_type": "text", 'description': 'a blue house', 'question_group': 'review_quiz'}) self.assertEqual(resp.status_code, 200) # but we can't change the question_type after creating it resp = self.put_json('/v1/quests/1/questions/1', { "question_type": "upload", 'description': 'a blue house', 'question_group': 'review_quiz'}) self.assertEqual(resp.status_code, 200) # and get them back resp = self.app.get("/v1/quests/1/questions/1") self.assertEqual(json.loads(resp.data), { "description": "a blue house", "question_type": "text", "id": 1, "url": "/v1/quests/1/questions/1", "creator_id": 1, "creator_url": "/v1/users/1", "multiple_choices": [], 'question_group': 'review_quiz', "quest_id": 1, "quest_url": "/v1/quests/1"}) # delete resp = self.app.delete("/v1/quests/1/questions/1") self.assertEqual(resp.status_code, 200) # and it's gone resp = self.app.get("/v1/quests/1/questions/1") self.assertEqual(resp.status_code, 404) resp = self.put_json('/v1/quests/1/questions/1', { "question_type": "text", 'description': 'a blue house', 'question_group': 'review_quiz'}) self.assertEqual(resp.status_code, 404) resp = self.app.delete("/v1/quests/1/questions/1") self.assertEqual(resp.status_code, 404) # make sure we can't create invalid question types resp = self.post_json(self.url_for( backend.question_views.QuestionList, parent_id=1), {"question_type": "snakes", 'description': 'a blue house'}) self.assertEqual(resp.status_code, 400) # and 404 on bad quest ids resp = self.app.get("/v1/quests/1/questions/2") self.assertEqual(resp.status_code, 200) resp = self.app.get("/v1/quests/2/questions/2") self.assertEqual(resp.status_code, 404) resp = self.post_json( self.url_for(backend.question_views.QuestionList, parent_id=20), {"question_type": "upload", "description": "snake farm", 'question_group': 'review_quiz'}) self.assertEqual(resp.status_code, 404) resp = self.app.get(self.url_for( backend.question_views.QuestionList, parent_id=20)) self.assertEqual(resp.status_code, 404) # cascade delete on quests to linked questions resp = self.app.get("/v1/quests/1/questions/2") self.assertEqual(resp.status_code, 200) resp = self.app.delete("/v1/quests/1") self.assertEqual(resp.status_code, 200) resp = self.app.get("/v1/quests/1/questions/2") self.assertEqual(resp.status_code, 404)
def test_tags(self): """Test creation and linking of tags.""" # nothing yet, so 404 resp = self.app.get(self.url_for(backend.quest_views.Tag, tag_id=1)) self.assertEqual(resp.status_code, 404) # create a user and some quests harness.create_user(name="snakes") resp = self.post_json( self.url_for(backend.quest_views.QuestList), {"name": "mouse", "summary": "hat"}) self.assertEqual(resp.status_code, 200) resp = self.post_json( self.url_for(backend.quest_views.QuestList), {"name": "cat", "summary": "derby"}) self.assertEqual(resp.status_code, 200) # create some resources resp = self.post_json( self.url_for(backend.quest_views.TagList), {"name": "a"}) self.assertEqual(json.loads(resp.data), { "name": "a", "creator_id": 1, "creator_url": "/v1/users/1", "id": 1, "url": "/v1/quest-tags/1"}) resp = self.post_json( self.url_for(backend.quest_views.TagList), {"name": "snakes"}) self.assertEqual(json.loads(resp.data), { "name": "snakes", "creator_id": 1, "creator_url": "/v1/users/1", "id": 2, "url": "/v1/quest-tags/2"}) # can't create two tags with the same name: resp = self.post_json( self.url_for(backend.quest_views.TagList), {"name": "a"}) self.assertEqual(resp.status_code, 400) resp = self.put_json( self.url_for(backend.quest_views.Tag, tag_id=2), {"name": "a"}) self.assertEqual(resp.status_code, 400) # edit resp = self.put_json( self.url_for(backend.quest_views.Tag, tag_id=2), {"name": "b"}) self.assertEqual(resp.status_code, 200) resp = self.app.get(self.url_for(backend.quest_views.Tag, tag_id=2)) self.assertEqual(json.loads(resp.data), { "name": "b", "creator_id": 1, "creator_url": "/v1/users/1", "id": 2, "url": "/v1/quest-tags/2"}) # list them all resp = self.app.get(self.url_for(backend.quest_views.TagList)) self.assertItemsEqual(json.loads(resp.data), {'tags': [ {"creator_id": 1, "creator_url": "/v1/users/1", "id": 1, "name": "a", "url": "/v1/quest-tags/1"}, {"creator_id": 1, "creator_url": "/v1/users/1", "id": 2, "name": "b", "url": "/v1/quest-tags/2"}]}) # create some links resp = self.app.put(self.url_for( backend.quest_views.QuestTagLink, left_id=1, right_id=1)) self.assertEqual(resp.status_code, 200) resp = self.app.put(self.url_for( backend.quest_views.QuestTagLink, left_id=1, right_id=2)) self.assertEqual(resp.status_code, 200) resp = self.app.put(self.url_for( backend.quest_views.QuestTagLink, left_id=2, right_id=1)) self.assertEqual(resp.status_code, 200) # idempotency check resp = self.app.put(self.url_for( backend.quest_views.QuestTagLink, left_id=1, right_id=1)) self.assertEqual(resp.status_code, 200) # see the links resp = self.app.get(self.url_for(backend.quest_views.Quest, quest_id=1)) self.assertItemsEqual(json.loads(resp.data)['tags'], [ {'name': 'a', 'id': 1, 'url': '/v1/quest-tags/1'}, {'name': 'b', 'id': 2, 'url': '/v1/quest-tags/2'}]) resp = self.app.get(self.url_for(backend.quest_views.Quest, quest_id=2)) self.assertItemsEqual(json.loads(resp.data)['tags'], [ {'name': 'a', 'id': 1, 'url': '/v1/quest-tags/1'}]) # remove a link resp = self.app.delete(self.url_for( backend.quest_views.QuestTagLink, left_id=1, right_id=1)) self.assertEqual(resp.status_code, 200) resp = self.app.get(self.url_for(backend.quest_views.Quest, quest_id=1)) self.assertItemsEqual(json.loads(resp.data)['tags'], [ {'name': 'b', 'id': 2, 'url': '/v1/quest-tags/2'}]) resp = self.app.get(self.url_for(backend.quest_views.Quest, quest_id=2)) self.assertItemsEqual(json.loads(resp.data)['tags'], [ {'name': 'a', 'id': 1, 'url': '/v1/quest-tags/1'}]) # remove a resource resp = self.app.delete(self.url_for(backend.quest_views.Tag, tag_id=1)) resp = self.app.get(self.url_for(backend.quest_views.Quest, quest_id=1)) self.assertItemsEqual(json.loads(resp.data)['tags'], [ {'name': 'b', 'id': 2, 'url': '/v1/quest-tags/2'}]) resp = self.app.get(self.url_for(backend.quest_views.Quest, quest_id=2)) self.assertItemsEqual(json.loads(resp.data)['tags'], []) resp = self.app.get(self.url_for(backend.quest_views.Tag, tag_id=1)) self.assertEqual(resp.status_code, 404) resp = self.app.delete(self.url_for(backend.quest_views.Tag, tag_id=1)) self.assertEqual(resp.status_code, 404) resp = self.put_json( self.url_for(backend.quest_views.Tag, tag_id=1), {'name': 'c'}) self.assertEqual(resp.status_code, 404)
def test_crud(self): """Basic CRUD tests.""" # no quest yet, so 404 resp = self.app.get("/v1/quest/1") self.assertEqual(resp.status_code, 404) # create a user, some missions, and some quests harness.create_user(name="snakes") harness.create_user(name="rakes") resp = self.post_json( self.url_for(backend.quest_views.QuestList), {"name": "mouse", "summary": "nip", "inquiry_questions": ['a', 'b']}) self.assertEqual(resp.status_code, 200) self.assertEqual(json.loads(resp.data), { "name": "mouse", "summary": "nip", "inquiry_questions": ["a", "b"], "icon_url": None, "video_links": [], "id": 1, "url": "/v1/quests/1", 'tags': [], "pbl_description": None, "mentor_guide": None, "min_grade_level": None, "max_grade_level": None, "hours_required": None, "minutes_required": None, "creator_id": 1, "creator_url": "/v1/users/1"}) self.assertEqual(resp.status_code, 200) resp = self.post_json( self.url_for(backend.quest_views.QuestList), {"name": "blouse", "summary": "blip"}) self.assertEqual(resp.status_code, 200) # create this one as a different user self.update_session(user_id=2) resp = self.post_json( self.url_for(backend.quest_views.QuestList), {"name": "house", "summary": "snip", "icon_url": "blue"}) self.assertEqual(resp.status_code, 200) self.update_session(user_id=1) # and get it back resp = self.app.get("/v1/quests/1") self.assertEqual(json.loads(resp.data), { 'creator_id': 1, 'creator_url': '/v1/users/1', 'summary': 'nip', 'icon_url': None, "inquiry_questions": ["a", "b"], 'tags': [], "pbl_description": None, "mentor_guide": None, "min_grade_level": None, "max_grade_level": None, "hours_required": None, "minutes_required": None, 'id': 1, 'video_links': [], 'url': '/v1/quests/1', 'name': 'mouse'}) # edit resp = self.put_json('/v1/quests/1', { 'summary': 'nip', 'name': 'mouse', 'icon_url': 'rubber', "pbl_description": 'p', "mentor_guide": 'g', "min_grade_level": 1, "max_grade_level": 2, "hours_required": 3, "minutes_required": 4, "video_links": ['snakes.mp4', 'ladders.mp4'], 'tags': [], 'inquiry_questions': ['b', 'c', 'd']}) self.assertEqual(resp.status_code, 200) # non-required values may be None resp = self.put_json('/v1/quests/1', { 'summary': 'nip', 'name': 'mouse', 'icon_url': 'rubber', "pbl_description": 'p', "mentor_guide": None, "min_grade_level": 1, "max_grade_level": None, "hours_required": 3, "minutes_required": 4, "video_links": ['snakes.mp4', 'ladders.mp4'], 'tags': [], 'inquiry_questions': ['b', 'c', 'd']}) self.assertEqual(resp.status_code, 200) # and get it back resp = self.app.get("/v1/quests/1") self.assertEqual(json.loads(resp.data), { 'creator_id': 1, 'creator_url': '/v1/users/1', 'summary': 'nip', "pbl_description": 'p', "mentor_guide": None, "min_grade_level": 1, "max_grade_level": None, "hours_required": 3, "minutes_required": 4, 'icon_url': 'rubber', "video_links": ['snakes.mp4', 'ladders.mp4'], "inquiry_questions": ["b", "c", "d"], 'tags': [], 'id': 1, 'url': '/v1/quests/1', 'name': 'mouse'}) # list them resp = self.app.get(self.url_for( backend.quest_views.QuestUserList, user_id=1)) self.assertItemsEqual(json.loads(resp.data)['quests'], [ {'creator_id': 1, 'summary': 'nip', 'icon_url': 'rubber', 'creator_url': '/v1/users/1', "inquiry_questions": ["b", "c", "d"], 'tags': [], "pbl_description": 'p', "mentor_guide": None, "min_grade_level": 1, "max_grade_level": None, "hours_required": 3, "minutes_required": 4, "video_links": ['snakes.mp4', 'ladders.mp4'], 'url': '/v1/quests/1', 'id': 1, 'name': 'mouse'}, {'creator_id': 1, 'summary': 'blip', 'icon_url': None, 'creator_url': '/v1/users/1', 'video_links': [], "inquiry_questions": [], 'tags': [], "pbl_description": None, "mentor_guide": None, "min_grade_level": None, "max_grade_level": None, "hours_required": None, "minutes_required": None, 'url': '/v1/quests/2', 'id': 2, 'name': 'blouse'}]) # delete resp = self.app.delete("/v1/quests/1") self.assertEqual(resp.status_code, 200) # and it's gone resp = self.app.get("/v1/quests/1") self.assertEqual(resp.status_code, 404) resp = self.put_json('/v1/quests/1', { 'summary': 'nip', 'name': 'mouse', 'icon_url': 'rubber'}) self.assertEqual(resp.status_code, 404) resp = self.app.delete("/v1/quests/1") self.assertEqual(resp.status_code, 404)
def test_links(self): """Test linking quests and missions together.""" # create the resources harness.create_user(name='snakes') resp = self.post_json( self.url_for(backend.quest_views.QuestList), {"name": "mouse", "summary": "nip"}) self.assertEqual(resp.status_code, 200) resp = self.post_json( self.url_for(backend.quest_views.QuestList), {"name": "blouse", "summary": "blip"}) self.assertEqual(resp.status_code, 200) resp = self.post_json( self.url_for(backend.mission_views.MissionList), {"name": "hat", "description": "snap", "points": 2}) self.assertEqual(resp.status_code, 200) resp = self.post_json( self.url_for(backend.mission_views.MissionList), {"name": "cat", "description": "map", "points": 1}) self.assertEqual(resp.status_code, 200) # no links yet resp = self.app.get(self.url_for( backend.quest_views.QuestMissionLinkList, mission_id=1)) self.assertEqual(resp.status_code, 200) self.assertEqual(json.loads(resp.data)['quests'], []) resp = self.app.get(self.url_for( backend.quest_views.QuestMissionLinkList, mission_id=100)) self.assertEqual(resp.status_code, 404) # create some links resp = self.app.put("/v1/missions/1/quests/1") self.assertEqual(resp.status_code, 200) resp = self.app.get(self.url_for( backend.quest_views.QuestMissionLinkList, mission_id=1)) self.assertEqual(json.loads(resp.data)['quests'], [ {"summary": "nip", "icon_url": None, "id": 1, "name": "mouse", "url": "/v1/quests/1", 'video_links': [], 'inquiry_questions': [], 'tags': [], "pbl_description": None, "mentor_guide": None, "min_grade_level": None, "max_grade_level": None, "hours_required": None, "minutes_required": None, 'creator_url': '/v1/users/1', "creator_id": 1}]) resp = self.app.put("/v1/missions/1/quests/2") self.assertEqual(resp.status_code, 200) resp = self.app.get(self.url_for( backend.quest_views.QuestMissionLinkList, mission_id=1)) self.assertItemsEqual(json.loads(resp.data)['quests'], [ {"summary": "nip", "icon_url": None, "id": 1, "name": "mouse", "url": "/v1/quests/1", 'video_links': [], 'inquiry_questions': [], 'tags': [], "pbl_description": None, "mentor_guide": None, "min_grade_level": None, "max_grade_level": None, "hours_required": None, "minutes_required": None, 'creator_url': '/v1/users/1', "creator_id": 1}, {'creator_id': 1, 'summary': 'blip', 'creator_url': '/v1/users/1', 'video_links': [], 'inquiry_questions': [], 'tags': [], "pbl_description": None, "mentor_guide": None, "min_grade_level": None, "max_grade_level": None, "hours_required": None, "minutes_required": None, 'url': '/v1/quests/2', 'icon_url': None, 'id': 2, 'name': 'blouse'}]) # still nothing linked to this mission resp = self.app.get(self.url_for( backend.quest_views.QuestMissionLinkList, mission_id=2)) self.assertEqual(json.loads(resp.data)['quests'], []) # check for idempotency resp = self.app.put("/v1/missions/1/quests/2") self.assertEqual(resp.status_code, 200) resp = self.app.get(self.url_for( backend.quest_views.QuestMissionLinkList, mission_id=1)) self.assertItemsEqual(json.loads(resp.data)['quests'], [ {"summary": "nip", "icon_url": None, "id": 1, "name": "mouse", "url": "/v1/quests/1", 'video_links': [], 'inquiry_questions': [], 'tags': [], "pbl_description": None, "mentor_guide": None, "min_grade_level": None, "max_grade_level": None, "hours_required": None, "minutes_required": None, 'creator_url': '/v1/users/1', "creator_id": 1}, {'creator_id': 1, 'summary': 'blip', 'creator_url': '/v1/users/1', 'video_links': [], 'inquiry_questions': [], 'tags': [], "pbl_description": None, "mentor_guide": None, "min_grade_level": None, "max_grade_level": None, "hours_required": None, "minutes_required": None, 'url': '/v1/quests/2', 'icon_url': None, 'id': 2, 'name': 'blouse'}]) # delete links resp = self.app.delete("/v1/missions/1/quests/2") self.assertEqual(resp.status_code, 200) resp = self.app.get(self.url_for( backend.quest_views.QuestMissionLinkList, mission_id=1)) self.assertEqual(json.loads(resp.data)['quests'], [ {"summary": "nip", "icon_url": None, "id": 1, "name": "mouse", "url": "/v1/quests/1", 'video_links': [], 'inquiry_questions': [], 'tags': [], "pbl_description": None, "mentor_guide": None, "min_grade_level": None, "max_grade_level": None, "hours_required": None, "minutes_required": None, 'creator_url': '/v1/users/1', "creator_id": 1}]) resp = self.app.delete("/v1/missions/1/quests/1") self.assertEqual(resp.status_code, 200) resp = self.app.get(self.url_for( backend.quest_views.QuestMissionLinkList, mission_id=1)) self.assertEqual(json.loads(resp.data)['quests'], []) # 404 on non-existent resources resp = self.app.delete("/v1/missions/1/quests/20") self.assertEqual(resp.status_code, 404) resp = self.app.delete("/v1/missions/30/quests/1") self.assertEqual(resp.status_code, 404)