define([ 'jquery', 'underscore', 'edx-ui-toolkit/js/utils/spec-helpers/ajax-helpers', 'common/js/spec_helpers/template_helpers', 'js/spec/edxnotes/helpers', 'logger', 'js/edxnotes/models/note', 'js/edxnotes/views/note_item' ], function( $, _, AjaxHelpers, TemplateHelpers, Helpers, Logger, NoteModel, NoteItemView ) { 'use strict'; describe('EdxNotes NoteItemView', function() { var getView = function(model, scrollToTag, formattedText) { model = new NoteModel(_.defaults(model || {}, { id: 'id-123', user: 'user-123', usage_id: 'usage_id-123', created: 'December 11, 2014 at 11:12AM', updated: 'December 11, 2014 at 11:12AM', text: formattedText || 'Third added model', quote: Helpers.LONG_TEXT, unit: { url: 'http://example.com/' } })); return new NoteItemView({model: model, scrollToTag: scrollToTag, view: 'Test View'}).render(); }; beforeEach(function() { TemplateHelpers.installTemplate('templates/edxnotes/note-item'); spyOn(Logger, 'log').and.callThrough(); }); it('can be rendered properly', function() { var view = getView(), unitLink = view.$('.reference-unit-link').get(0); expect(view.$el).toContainElement('.note-excerpt-more-link'); expect(view.$el).toContainText(Helpers.PRUNED_TEXT); expect(view.$el).toContainText('More'); view.$('.note-excerpt-more-link').click(); expect(view.$el).toContainText(Helpers.LONG_TEXT); expect(view.$el).toContainText('Less'); view = getView({quote: Helpers.SHORT_TEXT}); expect(view.$el).not.toContain('.note-excerpt-more-link'); expect(view.$el).toContainText(Helpers.SHORT_TEXT); expect(unitLink.hash).toBe('#id-123'); }); it('should display update value and accompanying text', function() { var view = getView(); expect(view.$('.reference-title')[1]).toContainText('Last Edited:'); expect(view.$('.reference-updated-date').last()).toContainText('December 11, 2014 at 11:12AM'); }); it('should not display tags if there are none', function() { var view = getView(); expect(view.$el).not.toContain('.reference-tags'); expect(view.$('.reference-title').length).toBe(2); }); it('should display tags if they exist', function() { var view = getView({tags: ['First', 'Second']}); expect(view.$('.reference-title').length).toBe(3); expect(view.$('.reference-title')[2]).toContainText('Tags:'); expect(view.$('span.reference-tags').length).toBe(2); expect(view.$('span.reference-tags')[0]).toContainText('First'); expect(view.$('span.reference-tags')[1]).toContainText('Second'); }); it('should highlight tags & text if they have elasticsearch formatter', function() { var view = getView({ tags: ['First', '{elasticsearch_highlight_start}Second{elasticsearch_highlight_end}'] }, {}, '{elasticsearch_highlight_start}Sample{elasticsearch_highlight_end}'); expect(view.$('.reference-title').length).toBe(3); expect(view.$('.reference-title')[2]).toContainText('Tags:'); expect(view.$('span.reference-tags').length).toBe(2); expect(view.$('span.reference-tags')[0]).toContainText('First'); // highlighted tag & text expect($.trim($(view.$('span.reference-tags')[1]).html())).toBe( '<span class="note-highlight">Second</span>' ); expect($.trim(view.$('.note-comment-p').html())).toBe('<span class="note-highlight">Sample</span>'); }); it('should escape html for tags & comments', function() { var view = getView({ tags: ['First', '<b>Second</b>', 'ȗnicode'] }, {}, '<b>Sample</b>'); expect(view.$('.reference-title').length).toBe(3); expect(view.$('.reference-title')[2]).toContainText('Tags:'); expect(view.$('span.reference-tags').length).toBe(3); expect(view.$('span.reference-tags')[0]).toContainText('First'); expect($.trim($(view.$('span.reference-tags')[1]).html())).toBe( '<b>Second</b>' ); expect($.trim($(view.$('span.reference-tags')[2]).html())).toBe('ȗnicode'); expect($.trim(view.$('.note-comment-p').html())).toBe('<b>Sample</b>'); }); xit('should handle a click event on the tag', function() { var scrollToTagSpy = { scrollToTag: function(tagName) {} }; spyOn(scrollToTagSpy, 'scrollToTag'); var view = getView({tags: ['only']}, scrollToTagSpy.scrollToTag); view.$('a.reference-tags').click(); expect(scrollToTagSpy.scrollToTag).toHaveBeenCalledWith('only'); }); it('should log the edx.course.student_notes.used_unit_link event properly', function() { var requests = AjaxHelpers.requests(this), view = getView(); spyOn(view, 'redirectTo'); view.$('.reference-unit-link').click(); expect(Logger.log).toHaveBeenCalledWith( 'edx.course.student_notes.used_unit_link', { 'note_id': 'id-123', 'component_usage_id': 'usage_id-123', 'view': 'Test View' }, null, { 'timeout': 2000 } ); expect(view.redirectTo).not.toHaveBeenCalled(); AjaxHelpers.respondWithJson(requests, {}); expect(view.redirectTo).toHaveBeenCalledWith('http://example.com/#id-123'); }); }); });