(function () { var settings = allure.getPluginSettings('screen-diff', { diffType: 'diff' }); function renderImage(src) { return ( '
' + '' + '
' ); } function findImage(data, name) { if (data.testStage && data.testStage.attachments) { var matchedImage = data.testStage.attachments.filter(function (attachment) { return attachment.name === name; })[0]; if (matchedImage) { return 'data/attachments/' + matchedImage.source; } } return null; } function renderDiffContent(type, diffImage, actualImage, expectedImage) { if (type === 'diff') { if (diffImage) { return renderImage(diffImage); } } if (type === 'overlay' && expectedImage) { return ( '
' + '' + '
' + '' + '
' + '
' ); } if (actualImage) { return renderImage(actualImage); } return 'No diff data provided'; } var TestResultView = Backbone.Marionette.View.extend({ regions: { subView: '.screen-diff-view', }, template: function () { return '
'; }, onRender: function () { var data = this.model.toJSON(); var testType = data.labels.filter(function (label) { return label.name === 'testType'; })[0]; var diffImage = findImage(data, 'diff'); var actualImage = findImage(data, 'actual'); var expectedImage = findImage(data, 'expected'); if (!testType || testType.value !== 'screenshotDiff') { return; } this.showChildView( 'subView', new ScreenDiffView({ diffImage: diffImage, actualImage: actualImage, expectedImage: expectedImage, }), ); }, }); var ErrorView = Backbone.Marionette.View.extend({ templateContext: function () { return this.options; }, template: function (data) { return '
' + data.error + '
'; }, }); var AttachmentView = Backbone.Marionette.View.extend({ regions: { subView: '.screen-diff-view', }, template: function () { return '
'; }, onRender: function () { jQuery .getJSON(this.options.sourceUrl) .then(this.renderScreenDiffView.bind(this), this.renderErrorView.bind(this)); }, renderErrorView: function (error) { console.log(error); this.showChildView( 'subView', new ErrorView({ error: error.statusText, }), ); }, renderScreenDiffView: function (data) { this.showChildView( 'subView', new ScreenDiffView({ diffImage: data.diff, actualImage: data.actual, expectedImage: data.expected, }), ); }, }); var ScreenDiffView = Backbone.Marionette.View.extend({ className: 'pane__section', events: function () { return { ['click [name="screen-diff-type-' + this.cid + '"]']: 'onDiffTypeChange', 'mousemove .screen-diff__overlay': 'onOverlayMove', }; }, initialize: function (options) { this.diffImage = options.diffImage; this.actualImage = options.actualImage; this.expectedImage = options.expectedImage; this.radioName = 'screen-diff-type-' + this.cid; }, templateContext: function () { return { diffType: settings.get('diffType'), diffImage: this.diffImage, actualImage: this.actualImage, expectedImage: this.expectedImage, radioName: this.radioName, }; }, template: function (data) { if (!data.diffImage && !data.actualImage && !data.expectedImage) { return ''; } return ( '

Screen Diff

' + '
' + '
' + '' + '' + '
' + renderDiffContent( data.diffType, data.diffImage, data.actualImage, data.expectedImage, ) + '
' ); }, adjustImageSize: function (event) { var overImage = this.$(event.target); overImage.width(overImage.width()); }, onRender: function () { const diffType = settings.get('diffType'); this.$('[name="' + this.radioName + '"][value="' + diffType + '"]').prop( 'checked', true, ); if (diffType === 'overlay') { this.$('.screen-diff__image-over img').on('load', this.adjustImageSize.bind(this)); } }, onOverlayMove: function (event) { var pageX = event.pageX; var containerScroll = this.$('.screen-diff__container').scrollLeft(); var elementX = event.currentTarget.getBoundingClientRect().left; var delta = pageX - elementX + containerScroll; this.$('.screen-diff__image-over').width(delta); }, onDiffTypeChange: function (event) { settings.save('diffType', event.target.value); this.render(); }, }); allure.api.addTestResultBlock(TestResultView, { position: 'before' }); allure.api.addAttachmentViewer('application/vnd.allure.image.diff', { View: AttachmentView, icon: 'fa fa-exchange', }); })();