diff --git a/common/static/coffee/src/discussion/discussion_module_view.coffee b/common/static/coffee/src/discussion/discussion_module_view.coffee index 8f27943560..7df5bc3656 100644 --- a/common/static/coffee/src/discussion/discussion_module_view.coffee +++ b/common/static/coffee/src/discussion/discussion_module_view.coffee @@ -97,7 +97,7 @@ if Backbone? else @$el.append($discussion) - @newPostForm = $('.new-post-article') + @newPostForm = this.$el.find('.new-post-article') @threadviews = @discussion.map (thread) => view = new DiscussionThreadView( el: @$("article#thread_#{thread.id}"), diff --git a/common/test/acceptance/pages/lms/discussion.py b/common/test/acceptance/pages/lms/discussion.py index d097fd76b5..a512e94588 100644 --- a/common/test/acceptance/pages/lms/discussion.py +++ b/common/test/acceptance/pages/lms/discussion.py @@ -368,6 +368,35 @@ class InlineDiscussionPage(PageObject): def element_exists(self, selector): return self.q(css=self._discussion_selector + " " + selector).present + def is_new_post_opened(self): + return self._find_within(".new-post-article").visible + + def click_element(self, selector): + self.wait_for_element_presence( + "{discussion} {selector}".format(discussion=self._discussion_selector, selector=selector), + "{selector} is visible".format(selector=selector) + ) + self._find_within(selector).click() + + def click_cancel_new_post(self): + self.click_element(".cancel") + EmptyPromise( + lambda: not self.is_new_post_opened(), + "New post closed" + ).fulfill() + + def click_new_post_button(self): + self.click_element(".new-post-btn") + EmptyPromise( + self.is_new_post_opened, + "New post opened" + ).fulfill() + + @wait_for_js + def _is_element_visible(self, selector): + query = self._find_within(selector) + return query.present and query.visible + class InlineDiscussionThreadPage(DiscussionThreadPage): def __init__(self, browser, thread_id): diff --git a/common/test/acceptance/tests/discussion/test_discussion.py b/common/test/acceptance/tests/discussion/test_discussion.py index 63b461586f..f82c0152a9 100644 --- a/common/test/acceptance/tests/discussion/test_discussion.py +++ b/common/test/acceptance/tests/discussion/test_discussion.py @@ -446,6 +446,7 @@ class InlineDiscussionTest(UniqueCourseTest, DiscussionResponsePaginationTestMix def setUp(self): super(InlineDiscussionTest, self).setUp() self.discussion_id = "test_discussion_{}".format(uuid4().hex) + self.additional_discussion_id = "test_discussion_{}".format(uuid4().hex) self.course_fix = CourseFixture(**self.course_info).add_children( XBlockFixtureDesc("chapter", "Test Section").add_children( XBlockFixtureDesc("sequential", "Test Subsection").add_children( @@ -454,6 +455,11 @@ class InlineDiscussionTest(UniqueCourseTest, DiscussionResponsePaginationTestMix "discussion", "Test Discussion", metadata={"discussion_id": self.discussion_id} + ), + XBlockFixtureDesc( + "discussion", + "Test Discussion 1", + metadata={"discussion_id": self.additional_discussion_id} ) ) ) @@ -465,6 +471,7 @@ class InlineDiscussionTest(UniqueCourseTest, DiscussionResponsePaginationTestMix self.courseware_page = CoursewarePage(self.browser, self.course_id) self.courseware_page.visit() self.discussion_page = InlineDiscussionPage(self.browser, self.discussion_id) + self.additional_discussion_page = InlineDiscussionPage(self.browser, self.additional_discussion_id) def setup_thread_page(self, thread_id): self.discussion_page.expand_discussion() @@ -526,6 +533,35 @@ class InlineDiscussionTest(UniqueCourseTest, DiscussionResponsePaginationTestMix self.assertFalse(self.thread_page.is_comment_deletable("comment1")) self.assertFalse(self.thread_page.is_comment_deletable("comment2")) + def test_dual_discussion_module(self): + """ + Scenario: Two discussion module in one unit shouldn't override their actions + Given that I'm on courseware page where there are two inline discussion + When I click on one discussion module new post button + Then it should add new post form of that module in DOM + And I should be shown new post form of that module + And I shouldn't be shown second discussion module new post form + And I click on second discussion module new post button + Then it should add new post form of second module in DOM + And I should be shown second discussion new post form + And I shouldn't be shown first discussion module new post form + And I have two new post form in the DOM + When I click back on first module new post button + And I should be shown new post form of that module + And I shouldn't be shown second discussion module new post form + """ + self.discussion_page.wait_for_page() + self.additional_discussion_page.wait_for_page() + self.discussion_page.click_new_post_button() + with self.discussion_page.handle_alert(): + self.discussion_page.click_cancel_new_post() + self.additional_discussion_page.click_new_post_button() + self.assertFalse(self.discussion_page._is_element_visible(".new-post-article")) + with self.additional_discussion_page.handle_alert(): + self.additional_discussion_page.click_cancel_new_post() + self.discussion_page.click_new_post_button() + self.assertFalse(self.additional_discussion_page._is_element_visible(".new-post-article")) + @attr('shard_1') class DiscussionUserProfileTest(UniqueCourseTest):