diff --git a/storyboardclient/tests/v1/test_stories.py b/storyboardclient/tests/v1/test_stories.py index 9edd275..db56310 100644 --- a/storyboardclient/tests/v1/test_stories.py +++ b/storyboardclient/tests/v1/test_stories.py @@ -73,3 +73,47 @@ class StoriesTestCase(test_base.TestCase): "/stories/test_story_id/tasks", {"title": "test_task", "story_id": "test_story_id"}) + + @mock.patch( + "storyboardclient.v1.timeline.TimeLineEventsNestedManager._list" + ) + def test_stories_list_events(self, mock_private_list): + test_story = stories.Story(mock.MagicMock(), + info={"id": "test_story_id"}) + + test_story.events.list() + + mock_private_list.assert_called_once_with( + "/stories/test_story_id/events", None) + + @mock.patch("storyboardclient.v1.timeline.CommentsNestedManager._list") + def test_stories_list_comments(self, mock_private_list): + test_story = stories.Story(mock.MagicMock(), + info={"id": "test_story_id"}) + + test_story.comments.list() + + mock_private_list.assert_called_once_with( + "/stories/test_story_id/comments", None) + + @mock.patch("storyboardclient.v1.timeline.CommentsNestedManager._post") + def test_stories_create_comment(self, mock_private_post): + test_story = stories.Story(mock.MagicMock(), + info={"id": "test_story_id"}) + + test_story.comments.create(content="test_comment") + + mock_private_post.assert_called_once_with( + "/stories/test_story_id/comments", + {"content": "test_comment"}) + + @mock.patch("storyboardclient.v1.timeline.CommentsNestedManager._put") + def test_stories_update_comment(self, mock_private_put): + test_story = stories.Story(mock.MagicMock(), + info={"id": "test_story_id"}) + test_story.comments.update(id="comment_id", + content="updated_test_comment") + + mock_private_put.assert_called_once_with( + "/stories/test_story_id/comments/comment_id", + {"content": "updated_test_comment"}) diff --git a/storyboardclient/v1/stories.py b/storyboardclient/v1/stories.py index fb5ee2c..46e3fc4 100644 --- a/storyboardclient/v1/stories.py +++ b/storyboardclient/v1/stories.py @@ -15,6 +15,7 @@ from storyboardclient import base from storyboardclient.v1 import tasks +from storyboardclient.v1 import timeline class Story(base.BaseObject): @@ -25,6 +26,8 @@ class Story(base.BaseObject): status = None tasks = tasks.TasksNestedManager + comments = timeline.CommentsNestedManager + events = timeline.TimeLineEventsNestedManager class StoriesManager(base.BaseManager): diff --git a/storyboardclient/v1/timeline.py b/storyboardclient/v1/timeline.py new file mode 100644 index 0000000..57c99c1 --- /dev/null +++ b/storyboardclient/v1/timeline.py @@ -0,0 +1,41 @@ +# Copyright (c) 2015 Mirantis Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +# implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from storyboardclient import base + + +class Comment(base.BaseObject): + content = None + is_active = None + + +class TimeLineEvent(base.BaseObject): + event_type = None + event_info = None + story_id = None + author_id = None + comment_id = None + + +class CommentsNestedManager(base.BaseNestedManager): + parent_url_key = "stories" + url_key = "comments" + resource_class = Comment + + +class TimeLineEventsNestedManager(base.BaseNestedManager): + parent_url_key = "stories" + url_key = "events" + resource_class = TimeLineEvent \ No newline at end of file