comments.py 5.42 KB
Newer Older
1 2 3 4 5 6
"""
Stub implementation of cs_comments_service for acceptance tests
"""

import re
import urlparse
7

8 9
from .http import StubHttpRequestHandler, StubHttpService

10

11
class StubCommentsServiceHandler(StubHttpRequestHandler):
12 13 14 15 16

    @property
    def _params(self):
        return urlparse.parse_qs(urlparse.urlparse(self.path).query)

17 18
    def do_GET(self):
        pattern_handlers = {
19
            "/api/v1/users/(?P<user_id>\\d+)/active_threads$": self.do_user_profile,
20
            "/api/v1/users/(?P<user_id>\\d+)$": self.do_user,
21
            "/api/v1/search/threads$": self.do_search_threads,
22 23
            "/api/v1/threads$": self.do_threads,
            "/api/v1/threads/(?P<thread_id>\\w+)$": self.do_thread,
24
            "/api/v1/comments/(?P<comment_id>\\w+)$": self.do_comment,
25
            "/api/v1/(?P<commentable_id>\\w+)/threads$": self.do_commentable,
26
        }
27 28 29 30 31 32
        if self.match_pattern(pattern_handlers):
            return

        self.send_response(404, content="404 Not Found")

    def match_pattern(self, pattern_handlers):
33 34 35 36 37
        path = urlparse.urlparse(self.path).path
        for pattern in pattern_handlers:
            match = re.match(pattern, path)
            if match:
                pattern_handlers[pattern](**match.groupdict())
38 39
                return True
        return None
40 41

    def do_PUT(self):
42 43
        if self.path.startswith('/set_config'):
            return StubHttpRequestHandler.do_PUT(self)
44 45 46 47 48
        pattern_handlers = {
            "/api/v1/users/(?P<user_id>\\d+)$": self.do_put_user,
        }
        if self.match_pattern(pattern_handlers):
            return
49 50
        self.send_response(204, "")

51 52 53 54
    def do_put_user(self, user_id):
        self.server.config['default_sort_key'] = self.post_dict.get("default_sort_key", "date")
        self.send_json_response({'username': self.post_dict.get("username"), 'external_id': self.post_dict.get("external_id")})

55
    def do_DELETE(self):
56 57 58 59 60
        pattern_handlers = {
            "/api/v1/comments/(?P<comment_id>\\w+)$": self.do_delete_comment
        }
        if self.match_pattern(pattern_handlers):
            return
61 62
        self.send_json_response({})

63
    def do_user(self, user_id):
64
        response = {
65
            "id": user_id,
66
            "default_sort_key": self.server.config.get("default_sort_key", "date"),
67 68 69
            "upvoted_ids": [],
            "downvoted_ids": [],
            "subscribed_thread_ids": [],
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
        }
        if 'course_id' in self._params:
            response.update({
                "threads_count": 1,
                "comments_count": 2
            })
        self.send_json_response(response)

    def do_user_profile(self, user_id):
        if 'active_threads' in self.server.config:
            user_threads = self.server.config['active_threads'][:]
            params = self._params
            page = int(params.get("page", ["1"])[0])
            per_page = int(params.get("per_page", ["20"])[0])
            num_pages = max(len(user_threads) - 1, 1) / per_page + 1
            user_threads = user_threads[(page - 1) * per_page:page * per_page]
            self.send_json_response({
                "collection": user_threads,
                "page": page,
                "num_pages": num_pages
90
            })
91 92
        else:
            self.send_response(404, content="404 Not Found")
93 94

    def do_thread(self, thread_id):
95 96 97 98 99 100 101 102 103 104 105 106
        if thread_id in self.server.config.get('threads', {}):
            thread = self.server.config['threads'][thread_id].copy()
            params = urlparse.parse_qs(urlparse.urlparse(self.path).query)
            if "recursive" in params and params["recursive"][0] == "True":
                thread.setdefault('children', [])
                resp_total = thread.setdefault('resp_total', len(thread['children']))
                resp_skip = int(params.get("resp_skip", ["0"])[0])
                resp_limit = int(params.get("resp_limit", ["10000"])[0])
                thread['children'] = thread['children'][resp_skip:(resp_skip + resp_limit)]
            self.send_json_response(thread)
        else:
            self.send_response(404, content="404 Not Found")
107 108

    def do_threads(self):
109
        threads = self.server.config.get('threads', {})
110
        threads_data = threads.values()
111
        self.send_json_response({"collection": threads_data, "page": 1, "num_pages": 1})
112

113 114 115
    def do_search_threads(self):
        self.send_json_response(self.server.config.get('search_result', {}))

116 117 118 119 120 121
    def do_comment(self, comment_id):
        # django_comment_client calls GET comment before doing a DELETE, so that's what this is here to support.
        if comment_id in self.server.config.get('comments', {}):
            comment = self.server.config['comments'][comment_id]
            self.send_json_response(comment)

122 123 124 125 126 127 128
    def do_delete_comment(self, comment_id):
        """Handle comment deletion. Returns a JSON representation of the
        deleted comment."""
        if comment_id in self.server.config.get('comments', {}):
            comment = self.server.config['comments'][comment_id]
            self.send_json_response(comment)

129 130 131 132 133 134 135 136 137 138 139
    def do_commentable(self, commentable_id):
        self.send_json_response({
            "collection": [
                thread
                for thread in self.server.config.get('threads', {}).values()
                if thread.get('commentable_id') == commentable_id
            ],
            "page": 1,
            "num_pages": 1,
        })

140 141 142

class StubCommentsService(StubHttpService):
    HANDLER_CLASS = StubCommentsServiceHandler