Esempio n. 1
0
    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)
Esempio n. 2
0
    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}]})
Esempio n. 3
0
    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)
Esempio n. 4
0
    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'}])
Esempio n. 5
0
    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)
Esempio n. 6
0
    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)
Esempio n. 7
0
    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)
Esempio n. 8
0
    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)
Esempio n. 9
0
    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)
Esempio n. 10
0
    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)
Esempio n. 11
0
    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)