diff --git a/lms/djangoapps/teams/static/teams/js/spec/views/team_discussion_spec.js b/lms/djangoapps/teams/static/teams/js/spec/views/team_discussion_spec.js index 889577224b8bf87ef23d82d573886f4dfdfd81c8..59dc359b84f10848a454047677a858bba5754d0b 100644 --- a/lms/djangoapps/teams/static/teams/js/spec/views/team_discussion_spec.js +++ b/lms/djangoapps/teams/static/teams/js/spec/views/team_discussion_spec.js @@ -38,84 +38,109 @@ define([ }; createPost = function(requests, view, title, body, threadID) { - title = title || "Test title"; - body = body || "Test body"; - threadID = threadID || "999"; - view.$('.new-post-button').click(); - view.$('.js-post-title').val(title); - view.$('.js-post-body textarea').val(body); - view.$('.submit').click(); - AjaxHelpers.expectRequest( - requests, 'POST', - interpolate( - '/courses/%(courseID)s/discussion/%(discussionID)s/threads/create?ajax=1', - { - courseID: TeamSpecHelpers.testCourseID, - discussionID: TeamSpecHelpers.testTeamDiscussionID - }, - true - ), - interpolate( - 'thread_type=discussion&title=%(title)s&body=%(body)s&anonymous=false&anonymous_to_peers=false&auto_subscribe=true', - { - title: title.replace(/ /g, '+'), - body: body.replace(/ /g, '+') - }, - true - ) - ); - AjaxHelpers.respondWithJson(requests, { - content: TeamSpecHelpers.createMockPostResponse({ - id: threadID, - title: title, - body: body - }), - annotated_content_info: TeamSpecHelpers.createAnnotatedContentInfo() + runs(function() { + title = title || "Test title"; + body = body || "Test body"; + threadID = threadID || "999"; + view.$('.new-post-button').click(); + view.$('.js-post-title').val(title); + view.$('.js-post-body textarea').val(body); }); + + waitsFor(function() { + return $('.submit').length; + }, "Submit button never appeared", 1000); + + runs(function() { + view.$('.submit').click(); + AjaxHelpers.expectRequest( + requests, 'POST', + interpolate( + '/courses/%(courseID)s/discussion/%(discussionID)s/threads/create?ajax=1', + { + courseID: TeamSpecHelpers.testCourseID, + discussionID: TeamSpecHelpers.testTeamDiscussionID + }, + true + ), + interpolate( + 'thread_type=discussion&title=%(title)s&body=%(body)s&anonymous=false&anonymous_to_peers=false&auto_subscribe=true', + { + title: title.replace(/ /g, '+'), + body: body.replace(/ /g, '+') + }, + true + ) + ); + AjaxHelpers.respondWithJson(requests, { + content: TeamSpecHelpers.createMockPostResponse({ + id: threadID, + title: title, + body: body + }), + annotated_content_info: TeamSpecHelpers.createAnnotatedContentInfo() + }); + }); }; expandReplies = function(requests, view, threadID) { - view.$('.forum-thread-expand').first().click(); - AjaxHelpers.expectRequest( - requests, 'GET', - interpolate( - '/courses/%(courseID)s/discussion/forum/%(discussionID)s/threads/%(threadID)s?ajax=1&resp_skip=0&resp_limit=25', - { - courseID: TeamSpecHelpers.testCourseID, - discussionID: TeamSpecHelpers.testTeamDiscussionID, - threadID: threadID || "999" - }, - true - ) - ); - AjaxHelpers.respondWithJson(requests, { - content: TeamSpecHelpers.createMockThreadResponse(), - annotated_content_info: TeamSpecHelpers.createAnnotatedContentInfo() - }); + waitsFor(function() { + return $('.forum-thread-expand').length; + }, "Forum expando link never appeared", 1000); + + runs(function() { + view.$('.forum-thread-expand').first().click(); + AjaxHelpers.expectRequest( + requests, 'GET', + interpolate( + '/courses/%(courseID)s/discussion/forum/%(discussionID)s/threads/%(threadID)s?ajax=1&resp_skip=0&resp_limit=25', + { + courseID: TeamSpecHelpers.testCourseID, + discussionID: TeamSpecHelpers.testTeamDiscussionID, + threadID: threadID || "999" + }, + true + ) + ); + AjaxHelpers.respondWithJson(requests, { + content: TeamSpecHelpers.createMockThreadResponse(), + annotated_content_info: TeamSpecHelpers.createAnnotatedContentInfo() + }); + }); }; postReply = function(requests, view, reply, threadID) { - var replyForm = view.$('.discussion-reply-new').first(); - replyForm.find('.reply-body textarea').val(reply); - replyForm.find('.discussion-submit-post').click(); - AjaxHelpers.expectRequest( - requests, 'POST', - interpolate( - '/courses/%(courseID)s/discussion/threads/%(threadID)s/reply?ajax=1', - { - courseID: TeamSpecHelpers.testCourseID, - threadID: threadID || "999" - }, - true - ), - 'body=' + reply.replace(/ /g, '+') - ); - AjaxHelpers.respondWithJson(requests, { - content: TeamSpecHelpers.createMockThreadResponse({ - body: reply, - comments_count: 1 - }), - "annotated_content_info": TeamSpecHelpers.createAnnotatedContentInfo() + var replyForm; + runs(function() { + replyForm = view.$('.discussion-reply-new').first(); + }); + + waitsFor(function() { + return replyForm.find('.discussion-submit-post').length; + }, "submit reply button never appeared", 1000); + + runs(function() { + replyForm.find('.reply-body textarea').val(reply); + replyForm.find('.discussion-submit-post').click(); + AjaxHelpers.expectRequest( + requests, 'POST', + interpolate( + '/courses/%(courseID)s/discussion/threads/%(threadID)s/reply?ajax=1', + { + courseID: TeamSpecHelpers.testCourseID, + threadID: threadID || "999" + }, + true + ), + 'body=' + reply.replace(/ /g, '+') + ); + AjaxHelpers.respondWithJson(requests, { + content: TeamSpecHelpers.createMockThreadResponse({ + body: reply, + comments_count: 1 + }), + "annotated_content_info": TeamSpecHelpers.createAnnotatedContentInfo() + }); }); }; @@ -127,17 +152,26 @@ define([ it('can create a new post', function() { var requests = AjaxHelpers.requests(this), - view = createDiscussionView(requests), + view, testTitle = 'New Post', testBody = 'New post body', newThreadElement; - createPost(requests, view, testTitle, testBody); + runs(function() { + view = createDiscussionView(requests); + createPost(requests, view, testTitle, testBody); + }); + + waitsFor(function() { + return $('.discussion-thread').length; + }, "Discussion thread never appeared", 1000); - // Expect the first thread to be the new post - expect(view.$('.discussion-thread').length).toEqual(4); - newThreadElement = view.$('.discussion-thread').first(); - expect(newThreadElement.find('.post-header-content h1').text().trim()).toEqual(testTitle); - expect(newThreadElement.find('.post-body').text().trim()).toEqual(testBody); + runs(function() { + // Expect the first thread to be the new post + expect(view.$('.discussion-thread').length).toEqual(4); + newThreadElement = view.$('.discussion-thread').first(); + expect(newThreadElement.find('.post-header-content h1').text().trim()).toEqual(testTitle); + expect(newThreadElement.find('.post-body').text().trim()).toEqual(testBody); + }); }); it('can post a reply', function() { @@ -145,59 +179,95 @@ define([ view = createDiscussionView(requests), testReply = "Test reply", testThreadID = "1"; - expandReplies(requests, view, testThreadID); - postReply(requests, view, testReply, testThreadID); - expect(view.$('.discussion-response .response-body').text().trim()).toBe(testReply); + runs(function() { + expandReplies(requests, view, testThreadID); + postReply(requests, view, testReply, testThreadID); + }); + + waitsFor(function() { + return view.$('.discussion-response .response-body').length; + }, "Discussion response never made visible", 1000); + + runs(function() { + expect(view.$('.discussion-response .response-body').text().trim()).toBe(testReply); + }); }); it('can post a reply to a new post', function() { var requests = AjaxHelpers.requests(this), view = createDiscussionView(requests, []), testReply = "Test reply"; - createPost(requests, view); - expandReplies(requests, view); - postReply(requests, view, testReply); - expect(view.$('.discussion-response .response-body').text().trim()).toBe(testReply); + runs(function() { + createPost(requests, view); + expandReplies(requests, view); + postReply(requests, view, testReply); + }); + + waitsFor(function() { + return view.$('.discussion-response .response-body').length; + }, "Discussion response never made visible", 1000); + + runs(function() { + expect(view.$('.discussion-response .response-body').text().trim()).toBe(testReply); + }); }); it('cannot move an existing thread to a different topic', function() { var requests = AjaxHelpers.requests(this), - view = createDiscussionView(requests), + view, postTopicButton, updatedThreadElement, updatedTitle = 'Updated title', updatedBody = 'Updated body', testThreadID = "1"; - expandReplies(requests, view, testThreadID); - view.$('.action-more .icon').first().click(); - view.$('.action-edit').first().click(); - postTopicButton = view.$('.post-topic'); - expect(postTopicButton.length).toBe(0); - view.$('.js-post-post-title').val(updatedTitle); - view.$('.js-post-body textarea').val(updatedBody); - view.$('.submit').click(); - AjaxHelpers.expectRequest( - requests, 'POST', - interpolate( - '/courses/%(courseID)s/discussion/%(discussionID)s/threads/create?ajax=1', - { - courseID: TeamSpecHelpers.testCourseID, - discussionID: TeamSpecHelpers.testTeamDiscussionID - }, - true - ), - 'thread_type=discussion&title=&body=Updated+body&anonymous=false&anonymous_to_peers=false&auto_subscribe=true' - ); - AjaxHelpers.respondWithJson(requests, { - content: TeamSpecHelpers.createMockPostResponse({ - id: "999", title: updatedTitle, body: updatedBody - }), - annotated_content_info: TeamSpecHelpers.createAnnotatedContentInfo() + runs(function() { + view = createDiscussionView(requests); + expandReplies(requests, view, testThreadID); + }); + + waitsFor(function() { + return view.$('.action-more .icon').length; + }, "Expanding replies never finished", 1000); + + runs(function() { + view.$('.action-more .icon').first().click(); + view.$('.action-edit').first().click(); + postTopicButton = view.$('.post-topic'); + expect(postTopicButton.length).toBe(0); + view.$('.js-post-post-title').val(updatedTitle); + view.$('.js-post-body textarea').val(updatedBody); }); - // Expect the thread to have been updated - updatedThreadElement = view.$('.discussion-thread').first(); - expect(updatedThreadElement.find('.post-header-content h1').text().trim()).toEqual(updatedTitle); - expect(updatedThreadElement.find('.post-body').text().trim()).toEqual(updatedBody); + waitsFor(function() { + return $('.submit').length; + }, "submit button never appeared", 1000); + + runs(function() { + view.$('.submit').click(); + AjaxHelpers.expectRequest( + requests, 'POST', + interpolate( + '/courses/%(courseID)s/discussion/%(discussionID)s/threads/create?ajax=1', + { + courseID: TeamSpecHelpers.testCourseID, + discussionID: TeamSpecHelpers.testTeamDiscussionID + }, + true + ), + 'thread_type=discussion&title=&body=Updated+body&anonymous=false&anonymous_to_peers=false&auto_subscribe=true' + ); + AjaxHelpers.respondWithJson(requests, { + content: TeamSpecHelpers.createMockPostResponse({ + id: "999", title: updatedTitle, body: updatedBody + }), + annotated_content_info: TeamSpecHelpers.createAnnotatedContentInfo() + }); + + + // Expect the thread to have been updated + updatedThreadElement = view.$('.discussion-thread').first(); + expect(updatedThreadElement.find('.post-header-content h1').text().trim()).toEqual(updatedTitle); + expect(updatedThreadElement.find('.post-body').text().trim()).toEqual(updatedBody); + }); }); it('cannot move a new thread to a different topic', function() {