This commit implements STUD-1490, allowing creation of components on the container page. It also enables the delete and duplicate buttons now that new content can be created that would benefit. Note that it also creates shared functionality for adding components, and refactors the unit page to use it too.
176 lines
7.0 KiB
CoffeeScript
176 lines
7.0 KiB
CoffeeScript
define ["jquery", "js/spec_helpers/edit_helpers", "coffee/src/views/module_edit", "js/models/module_info", "xmodule"], ($, edit_helpers, ModuleEdit, ModuleModel) ->
|
|
|
|
describe "ModuleEdit", ->
|
|
beforeEach ->
|
|
@stubModule = new ModuleModel
|
|
id: "stub-id"
|
|
|
|
setFixtures """
|
|
<ul>
|
|
<li class="component" id="stub-id" data-locator="stub-id">
|
|
<div class="component-editor">
|
|
<div class="module-editor">
|
|
${editor}
|
|
</div>
|
|
<a href="#" class="save-button">Save</a>
|
|
<a href="#" class="cancel-button">Cancel</a>
|
|
</div>
|
|
<div class="component-actions">
|
|
<a href="#" class="edit-button"><span class="edit-icon white"></span>Edit</a>
|
|
<a href="#" class="delete-button"><span class="delete-icon white"></span>Delete</a>
|
|
</div>
|
|
<span class="drag-handle action"></span>
|
|
<section class="xblock xblock-student_view xmodule_display xmodule_stub" data-type="StubModule">
|
|
<div id="stub-module-content"/>
|
|
</section>
|
|
</li>
|
|
</ul>
|
|
"""
|
|
edit_helpers.installEditTemplates(true);
|
|
spyOn($, 'ajax').andReturn(@moduleData)
|
|
|
|
@moduleEdit = new ModuleEdit(
|
|
el: $(".component")
|
|
model: @stubModule
|
|
onDelete: jasmine.createSpy()
|
|
)
|
|
|
|
describe "class definition", ->
|
|
it "sets the correct tagName", ->
|
|
expect(@moduleEdit.tagName).toEqual("li")
|
|
|
|
it "sets the correct className", ->
|
|
expect(@moduleEdit.className).toEqual("component")
|
|
|
|
describe "methods", ->
|
|
describe "initialize", ->
|
|
beforeEach ->
|
|
spyOn(ModuleEdit.prototype, 'render')
|
|
@moduleEdit = new ModuleEdit(
|
|
el: $(".component")
|
|
model: @stubModule
|
|
onDelete: jasmine.createSpy()
|
|
)
|
|
|
|
it "renders the module editor", ->
|
|
expect(ModuleEdit.prototype.render).toHaveBeenCalled()
|
|
|
|
describe "render", ->
|
|
beforeEach ->
|
|
spyOn(@moduleEdit, 'loadDisplay')
|
|
spyOn(@moduleEdit, 'delegateEvents')
|
|
spyOn($.fn, 'append')
|
|
spyOn($, 'getScript').andReturn($.Deferred().resolve().promise())
|
|
|
|
window.MockXBlock = (runtime, element) ->
|
|
return { }
|
|
|
|
window.loadedXBlockResources = undefined
|
|
|
|
@moduleEdit.render()
|
|
$.ajax.mostRecentCall.args[0].success(
|
|
html: '<div>Response html</div>'
|
|
resources: [
|
|
['hash1', {kind: 'text', mimetype: 'text/css', data: 'inline-css'}],
|
|
['hash2', {kind: 'url', mimetype: 'text/css', data: 'css-url'}],
|
|
['hash3', {kind: 'text', mimetype: 'application/javascript', data: 'inline-js'}],
|
|
['hash4', {kind: 'url', mimetype: 'application/javascript', data: 'js-url'}],
|
|
['hash5', {placement: 'head', mimetype: 'text/html', data: 'head-html'}],
|
|
['hash6', {placement: 'not-head', mimetype: 'text/html', data: 'not-head-html'}],
|
|
]
|
|
)
|
|
|
|
afterEach ->
|
|
window.MockXBlock = null
|
|
|
|
it "loads the module preview via ajax on the view element", ->
|
|
expect($.ajax).toHaveBeenCalledWith(
|
|
url: "/xblock/#{@moduleEdit.model.id}/student_view"
|
|
type: "GET"
|
|
headers:
|
|
Accept: 'application/json'
|
|
success: jasmine.any(Function)
|
|
)
|
|
|
|
expect($.ajax).not.toHaveBeenCalledWith(
|
|
url: "/xblock/#{@moduleEdit.model.id}/studio_view"
|
|
type: "GET"
|
|
headers:
|
|
Accept: 'application/json'
|
|
success: jasmine.any(Function)
|
|
)
|
|
expect(@moduleEdit.loadDisplay).toHaveBeenCalled()
|
|
expect(@moduleEdit.delegateEvents).toHaveBeenCalled()
|
|
|
|
it "loads the editing view via ajax on demand", ->
|
|
edit_helpers.installEditTemplates(true);
|
|
expect($.ajax).not.toHaveBeenCalledWith(
|
|
url: "/xblock/#{@moduleEdit.model.id}/studio_view"
|
|
type: "GET"
|
|
headers:
|
|
Accept: 'application/json'
|
|
success: jasmine.any(Function)
|
|
)
|
|
|
|
@moduleEdit.clickEditButton({'preventDefault': jasmine.createSpy('event.preventDefault')})
|
|
|
|
mockXBlockEditorHtml = readFixtures('mock/mock-xblock-editor.underscore')
|
|
|
|
$.ajax.mostRecentCall.args[0].success(
|
|
html: mockXBlockEditorHtml
|
|
resources: [
|
|
['hash1', {kind: 'text', mimetype: 'text/css', data: 'inline-css'}],
|
|
['hash2', {kind: 'url', mimetype: 'text/css', data: 'css-url'}],
|
|
['hash3', {kind: 'text', mimetype: 'application/javascript', data: 'inline-js'}],
|
|
['hash4', {kind: 'url', mimetype: 'application/javascript', data: 'js-url'}],
|
|
['hash5', {placement: 'head', mimetype: 'text/html', data: 'head-html'}],
|
|
['hash6', {placement: 'not-head', mimetype: 'text/html', data: 'not-head-html'}],
|
|
]
|
|
)
|
|
|
|
expect($.ajax).toHaveBeenCalledWith(
|
|
url: "/xblock/#{@moduleEdit.model.id}/studio_view"
|
|
type: "GET"
|
|
headers:
|
|
Accept: 'application/json'
|
|
success: jasmine.any(Function)
|
|
)
|
|
expect(@moduleEdit.delegateEvents).toHaveBeenCalled()
|
|
|
|
it "loads inline css from fragments", ->
|
|
expect($('head').append).toHaveBeenCalledWith("<style type='text/css'>inline-css</style>")
|
|
|
|
it "loads css urls from fragments", ->
|
|
expect($('head').append).toHaveBeenCalledWith("<link rel='stylesheet' href='css-url' type='text/css'>")
|
|
|
|
it "loads inline js from fragments", ->
|
|
expect($('head').append).toHaveBeenCalledWith("<script>inline-js</script>")
|
|
|
|
it "loads js urls from fragments", ->
|
|
expect($.getScript).toHaveBeenCalledWith("js-url")
|
|
|
|
it "loads head html", ->
|
|
expect($('head').append).toHaveBeenCalledWith("head-html")
|
|
|
|
it "doesn't load body html", ->
|
|
expect($.fn.append).not.toHaveBeenCalledWith('not-head-html')
|
|
|
|
it "doesn't reload resources", ->
|
|
count = $('head').append.callCount
|
|
$.ajax.mostRecentCall.args[0].success(
|
|
html: '<div>Response html 2</div>'
|
|
resources: [
|
|
['hash1', {kind: 'text', mimetype: 'text/css', data: 'inline-css'}],
|
|
]
|
|
)
|
|
expect($('head').append.callCount).toBe(count)
|
|
|
|
describe "loadDisplay", ->
|
|
beforeEach ->
|
|
spyOn(XBlock, 'initializeBlock')
|
|
@moduleEdit.loadDisplay()
|
|
|
|
it "loads the .xmodule-display inside the module editor", ->
|
|
expect(XBlock.initializeBlock).toHaveBeenCalled()
|
|
expect(XBlock.initializeBlock.mostRecentCall.args[0]).toBe($('.xblock-student_view'))
|