예제 #1
0
    def test_question_content(self):
        thread = self.make_minimal_cs_thread({
            "thread_type": "question",
            "endorsed_responses": [make_minimal_cs_comment({"id": "endorsed_comment"})],
            "non_endorsed_responses": [make_minimal_cs_comment({"id": "non_endorsed_comment"})],
            "non_endorsed_resp_total": 1,
        })

        endorsed_actual = self.get_comment_list(thread, endorsed=True)
        self.assertEqual(endorsed_actual["results"][0]["id"], "endorsed_comment")

        non_endorsed_actual = self.get_comment_list(thread, endorsed=False)
        self.assertEqual(non_endorsed_actual["results"][0]["id"], "non_endorsed_comment")
예제 #2
0
 def test_question_content(self, endorsed, comment_id):
     self.register_get_user_response(self.user)
     thread = self.make_minimal_cs_thread(
         {
             "thread_type": "question",
             "endorsed_responses": [make_minimal_cs_comment({"id": "endorsed_comment"})],
             "non_endorsed_responses": [make_minimal_cs_comment({"id": "non_endorsed_comment"})],
             "non_endorsed_resp_total": 1,
         }
     )
     self.register_get_thread_response(thread)
     response = self.client.get(self.url, {"thread_id": thread["id"], "endorsed": endorsed})
     parsed_content = json.loads(response.content)
     self.assertEqual(parsed_content["results"][0]["id"], comment_id)
예제 #3
0
 def test_basic(self):
     self.register_get_user_response(self.user)
     cs_thread = make_minimal_cs_thread({
         "id":
         "test_thread",
         "course_id":
         unicode(self.course.id),
     })
     self.register_get_thread_response(cs_thread)
     cs_comment = make_minimal_cs_comment({
         "id":
         self.comment_id,
         "course_id":
         cs_thread["course_id"],
         "thread_id":
         cs_thread["id"],
         "username":
         self.user.username,
         "user_id":
         str(self.user.id),
     })
     self.register_get_comment_response(cs_comment)
     self.register_delete_comment_response(self.comment_id)
     response = self.client.delete(self.url)
     self.assertEqual(response.status_code, 204)
     self.assertEqual(response.content, "")
     self.assertEqual(
         urlparse(httpretty.last_request().path).path,
         "/api/v1/comments/{}".format(self.comment_id))
     self.assertEqual(httpretty.last_request().method, "DELETE")
예제 #4
0
 def setUp(self):
     super(CommentViewSetPartialUpdateTest, self).setUp()
     httpretty.reset()
     httpretty.enable()
     self.addCleanup(httpretty.disable)
     self.register_get_user_response(self.user)
     self.url = reverse("comment-detail",
                        kwargs={"comment_id": "test_comment"})
     cs_thread = make_minimal_cs_thread({
         "id":
         "test_thread",
         "course_id":
         unicode(self.course.id),
     })
     self.register_get_thread_response(cs_thread)
     cs_comment = make_minimal_cs_comment({
         "id":
         "test_comment",
         "course_id":
         cs_thread["course_id"],
         "thread_id":
         cs_thread["id"],
         "username":
         self.user.username,
         "user_id":
         str(self.user.id),
         "created_at":
         "2015-06-03T00:00:00Z",
         "updated_at":
         "2015-06-03T00:00:00Z",
         "body":
         "Original body",
     })
     self.register_get_comment_response(cs_comment)
     self.register_put_comment_response(cs_comment)
 def make_cs_content(self, overrides=None, with_endorsement=False):
     """
     Create a comment with the given overrides, plus some useful test data.
     """
     merged_overrides = {"user_id": str(self.author.id), "username": self.author.username}
     if with_endorsement:
         merged_overrides["endorsement"] = {"user_id": str(self.endorser.id), "time": self.endorsed_at}
     merged_overrides.update(overrides or {})
     return make_minimal_cs_comment(merged_overrides)
예제 #6
0
 def make_cs_content(self, overrides):
     """
     Create a comment with the given overrides, plus some useful test data.
     """
     merged_overrides = {
         "user_id": str(self.author.id),
         "username": self.author.username
     }
     merged_overrides.update(overrides)
     return make_minimal_cs_comment(merged_overrides)
예제 #7
0
 def test_endorsed_by_anonymity(self):
     """
     Ensure thread anonymity is properly considered in serializing
     endorsed_by.
     """
     thread = self.make_minimal_cs_thread({
         "anonymous": True,
         "children": [
             make_minimal_cs_comment({
                 "endorsement": {"user_id": str(self.author.id), "time": "2015-05-18T12:34:56Z"}
             })
         ]
     })
     actual_comments = self.get_comment_list(thread)["results"]
     self.assertIsNone(actual_comments[0]["endorsed_by"])
예제 #8
0
 def make_cs_content(self, overrides=None, with_endorsement=False):
     """
     Create a comment with the given overrides, plus some useful test data.
     """
     merged_overrides = {
         "user_id": str(self.author.id),
         "username": self.author.username
     }
     if with_endorsement:
         merged_overrides["endorsement"] = {
             "user_id": str(self.endorser.id),
             "time": self.endorsed_at
         }
     merged_overrides.update(overrides or {})
     return make_minimal_cs_comment(merged_overrides)
예제 #9
0
 def test_basic_query_params(self):
     self.get_comment_list(
         self.make_minimal_cs_thread({"children": [make_minimal_cs_comment()], "resp_total": 71}),
         page=6,
         page_size=14,
     )
     self.assert_query_params_equal(
         httpretty.httpretty.latest_requests[-2],
         {
             "recursive": ["True"],
             "user_id": [str(self.user.id)],
             "mark_as_read": ["True"],
             "resp_skip": ["70"],
             "resp_limit": ["14"],
         },
     )
예제 #10
0
 def register_comment(self, overrides=None):
     """
     Create cs_comment with minimal fields and register response
     """
     cs_comment = make_minimal_cs_comment({
         "id": "test_comment",
         "course_id": unicode(self.course.id),
         "thread_id": "test_thread",
         "username": self.user.username,
         "user_id": str(self.user.id),
         "body": "Original body",
     })
     cs_comment.update(overrides or {})
     self.register_get_comment_response(cs_comment)
     self.register_put_comment_response(cs_comment)
     self.register_post_comment_response(cs_comment, thread_id="test_thread")
예제 #11
0
 def test_basic_query_params(self):
     self.get_comment_list(self.make_minimal_cs_thread({
         "children": [make_minimal_cs_comment()],
         "resp_total":
         71
     }),
                           page=6,
                           page_size=14)
     self.assert_query_params_equal(
         httpretty.httpretty.latest_requests[-2], {
             "recursive": ["True"],
             "user_id": [str(self.user.id)],
             "mark_as_read": ["True"],
             "resp_skip": ["70"],
             "resp_limit": ["14"],
         })
예제 #12
0
    def test_cs_pagination(self, thread_type, endorsed_arg, response_field, response_total_field):
        """
        Test cases in which pagination is done by the comments service.

        thread_type is the type of thread (question or discussion).
        endorsed_arg is the value of the endorsed argument.
        repsonse_field is the field in which responses are returned for the
          given thread type.
        response_total_field is the field in which the total number of responses
          is returned for the given thread type.
        """
        # N.B. The mismatch between the number of children and the listed total
        # number of responses is unrealistic but convenient for this test
        thread = self.make_minimal_cs_thread({
            "thread_type": thread_type,
            response_field: [make_minimal_cs_comment()],
            response_total_field: 5,
        })

        # Only page
        actual = self.get_comment_list(thread, endorsed=endorsed_arg, page=1, page_size=5)
        self.assertIsNone(actual["next"])
        self.assertIsNone(actual["previous"])

        # First page of many
        actual = self.get_comment_list(thread, endorsed=endorsed_arg, page=1, page_size=2)
        self.assertEqual(actual["next"], "http://testserver/test_path?page=2")
        self.assertIsNone(actual["previous"])

        # Middle page of many
        actual = self.get_comment_list(thread, endorsed=endorsed_arg, page=2, page_size=2)
        self.assertEqual(actual["next"], "http://testserver/test_path?page=3")
        self.assertEqual(actual["previous"], "http://testserver/test_path?page=1")

        # Last page of many
        actual = self.get_comment_list(thread, endorsed=endorsed_arg, page=3, page_size=2)
        self.assertIsNone(actual["next"])
        self.assertEqual(actual["previous"], "http://testserver/test_path?page=2")

        # Page past the end
        thread = self.make_minimal_cs_thread({
            "thread_type": thread_type,
            response_field: [],
            response_total_field: 5
        })
        with self.assertRaises(Http404):
            self.get_comment_list(thread, endorsed=endorsed_arg, page=2, page_size=5)
예제 #13
0
 def make_comment_data(self, comment_id, parent_id=None, children=[]):  # pylint: disable=W0102
     """
     Returns comment dict object as returned by comments service
     """
     return make_minimal_cs_comment({
         "id": comment_id,
         "parent_id": parent_id,
         "course_id": unicode(self.course.id),
         "thread_id": self.thread_id,
         "thread_type": "discussion",
         "username": self.user.username,
         "user_id": str(self.user.id),
         "created_at": "2015-06-03T00:00:00Z",
         "updated_at": "2015-06-03T00:00:00Z",
         "body": "Original body",
         "children": children,
     })
예제 #14
0
 def make_comment_data(self, comment_id, parent_id=None, children=[]):  # pylint: disable=W0102
     """
     Returns comment dict object as returned by comments service
     """
     return make_minimal_cs_comment({
         "id": comment_id,
         "parent_id": parent_id,
         "course_id": unicode(self.course.id),
         "thread_id": self.thread_id,
         "thread_type": "discussion",
         "username": self.user.username,
         "user_id": str(self.user.id),
         "created_at": "2015-06-03T00:00:00Z",
         "updated_at": "2015-06-03T00:00:00Z",
         "body": "Original body",
         "children": children,
     })
예제 #15
0
    def test_question_endorsed_pagination(self):
        thread = self.make_minimal_cs_thread(
            {
                "thread_type": "question",
                "endorsed_responses": [make_minimal_cs_comment({"id": "comment_{}".format(i)}) for i in range(10)],
            }
        )

        def assert_page_correct(page, page_size, expected_start, expected_stop, expected_next, expected_prev):
            """
            Check that requesting the given page/page_size returns the expected
            output
            """
            actual = self.get_comment_list(thread, endorsed=True, page=page, page_size=page_size)
            result_ids = [result["id"] for result in actual["results"]]
            self.assertEqual(result_ids, ["comment_{}".format(i) for i in range(expected_start, expected_stop)])
            self.assertEqual(
                actual["next"], "http://testserver/test_path?page={}".format(expected_next) if expected_next else None
            )
            self.assertEqual(
                actual["previous"],
                "http://testserver/test_path?page={}".format(expected_prev) if expected_prev else None,
            )

        # Only page
        assert_page_correct(
            page=1, page_size=10, expected_start=0, expected_stop=10, expected_next=None, expected_prev=None
        )

        # First page of many
        assert_page_correct(page=1, page_size=4, expected_start=0, expected_stop=4, expected_next=2, expected_prev=None)

        # Middle page of many
        assert_page_correct(page=2, page_size=4, expected_start=4, expected_stop=8, expected_next=3, expected_prev=1)

        # Last page of many
        assert_page_correct(
            page=3, page_size=4, expected_start=8, expected_stop=10, expected_next=None, expected_prev=2
        )

        # Page past the end
        with self.assertRaises(Http404):
            self.get_comment_list(thread, endorsed=True, page=2, page_size=10)
예제 #16
0
 def setUp(self):
     super(CommentSerializerDeserializationTest, self).setUp()
     httpretty.reset()
     httpretty.enable()
     self.addCleanup(httpretty.disable)
     self.user = UserFactory.create()
     self.register_get_user_response(self.user)
     self.request = RequestFactory().get("/dummy")
     self.request.user = self.user
     self.minimal_data = {
         "thread_id": "test_thread",
         "raw_body": "Test body",
     }
     self.existing_comment = Comment(**make_minimal_cs_comment({
         "id": "existing_comment",
         "thread_id": "existing_thread",
         "body": "Original body",
         "user_id": str(self.user.id),
         "course_id": unicode(self.course.id),
     }))
예제 #17
0
 def test_basic(self):
     self.register_get_user_response(self.user)
     cs_thread = make_minimal_cs_thread({"id": "test_thread", "course_id": unicode(self.course.id)})
     self.register_get_thread_response(cs_thread)
     cs_comment = make_minimal_cs_comment(
         {
             "id": self.comment_id,
             "course_id": cs_thread["course_id"],
             "thread_id": cs_thread["id"],
             "username": self.user.username,
             "user_id": str(self.user.id),
         }
     )
     self.register_get_comment_response(cs_comment)
     self.register_delete_comment_response(self.comment_id)
     response = self.client.delete(self.url)
     self.assertEqual(response.status_code, 204)
     self.assertEqual(response.content, "")
     self.assertEqual(urlparse(httpretty.last_request().path).path, "/api/v1/comments/{}".format(self.comment_id))
     self.assertEqual(httpretty.last_request().method, "DELETE")
예제 #18
0
 def setUp(self):
     super(CommentSerializerDeserializationTest, self).setUp()
     httpretty.reset()
     httpretty.enable()
     self.addCleanup(httpretty.disable)
     self.user = UserFactory.create()
     self.register_get_user_response(self.user)
     self.request = RequestFactory().get("/dummy")
     self.request.user = self.user
     self.minimal_data = {
         "thread_id": "test_thread",
         "raw_body": "Test body",
     }
     self.existing_comment = Comment(**make_minimal_cs_comment({
         "id": "existing_comment",
         "thread_id": "existing_thread",
         "body": "Original body",
         "user_id": str(self.user.id),
         "course_id": unicode(self.course.id),
     }))
예제 #19
0
 def setUp(self):
     super(CommentViewSetPartialUpdateTest, self).setUp()
     httpretty.reset()
     httpretty.enable()
     self.addCleanup(httpretty.disable)
     self.register_get_user_response(self.user)
     self.url = reverse("comment-detail", kwargs={"comment_id": "test_comment"})
     cs_thread = make_minimal_cs_thread({"id": "test_thread", "course_id": unicode(self.course.id)})
     self.register_get_thread_response(cs_thread)
     cs_comment = make_minimal_cs_comment(
         {
             "id": "test_comment",
             "course_id": cs_thread["course_id"],
             "thread_id": cs_thread["id"],
             "username": self.user.username,
             "user_id": str(self.user.id),
             "created_at": "2015-06-03T00:00:00Z",
             "updated_at": "2015-06-03T00:00:00Z",
             "body": "Original body",
         }
     )
     self.register_get_comment_response(cs_comment)
     self.register_put_comment_response(cs_comment)
예제 #20
0
    def test_question_endorsed_pagination(self):
        thread = self.make_minimal_cs_thread({
            "thread_type": "question",
            "endorsed_responses": [
                make_minimal_cs_comment({"id": "comment_{}".format(i)}) for i in range(10)
            ]
        })

        def assert_page_correct(page, page_size, expected_start, expected_stop, expected_next, expected_prev):
            """
            Check that requesting the given page/page_size returns the expected
            output
            """
            actual = self.get_comment_list(thread, endorsed=True, page=page, page_size=page_size)
            result_ids = [result["id"] for result in actual["results"]]
            self.assertEqual(
                result_ids,
                ["comment_{}".format(i) for i in range(expected_start, expected_stop)]
            )
            self.assertEqual(
                actual["next"],
                "http://testserver/test_path?page={}".format(expected_next) if expected_next else None
            )
            self.assertEqual(
                actual["previous"],
                "http://testserver/test_path?page={}".format(expected_prev) if expected_prev else None
            )

        # Only page
        assert_page_correct(
            page=1,
            page_size=10,
            expected_start=0,
            expected_stop=10,
            expected_next=None,
            expected_prev=None
        )

        # First page of many
        assert_page_correct(
            page=1,
            page_size=4,
            expected_start=0,
            expected_stop=4,
            expected_next=2,
            expected_prev=None
        )

        # Middle page of many
        assert_page_correct(
            page=2,
            page_size=4,
            expected_start=4,
            expected_stop=8,
            expected_next=3,
            expected_prev=1
        )

        # Last page of many
        assert_page_correct(
            page=3,
            page_size=4,
            expected_start=8,
            expected_stop=10,
            expected_next=None,
            expected_prev=2
        )

        # Page past the end
        with self.assertRaises(Http404):
            self.get_comment_list(thread, endorsed=True, page=2, page_size=10)