Skip to content

Commit

Permalink
screen-diff-plugin: support multiple screen diffs per test via custom…
Browse files Browse the repository at this point in the history
… attachement view

closes #613
  • Loading branch information
just-boris committed Nov 14, 2020
1 parent d830da2 commit 04a3079
Show file tree
Hide file tree
Showing 12 changed files with 272 additions and 72 deletions.
2 changes: 2 additions & 0 deletions allure-generator/.prettierrc
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
{
"tabWidth": 4,
"singleQuote": true,
"printWidth": 100,
"trailingComma": "all"
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
{{#if (eq type "code")}}
{{#if (eq type "custom")}}
<div class="attachment__custom-view"></div>
{{else if (eq type "code")}}
<div class="{{b 'attachment__text-container' fullscreen=fullScreen}}">
<pre class="attachment__code">{{content}}</pre>
</div>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
import './styles.scss';
import highlight from '../../utils/highlight';
import {View} from 'backbone.marionette';
import { View } from 'backbone.marionette';
import $ from 'jquery';
import router from '../../router';
import {className, on, behavior} from '../../decorators';
import { className, on, behavior, regions } from '../../decorators';
import attachmentType from '../../utils/attachmentType';
import template from './AttachmentView.hbs';


@className('attachment')
@behavior('TooltipBehavior', {position: 'bottom'})
@behavior('TooltipBehavior', { position: 'bottom' })
@regions({
customView: '.attachment__custom-view',
})
class AttachmentView extends View {
template = template;

Expand All @@ -21,17 +23,22 @@ class AttachmentView extends View {
}

onRender() {
if(this.needsFetch() && !this.content) {
if (this.attachmentInfo.type === 'custom') {
this.showChildView('customView', new this.attachmentInfo.View({
sourceUrl: this.sourceUrl,
attachment: this.attachment
}));
} else if (this.needsFetch() && !this.content) {
this.loadContent().then(this.render);
} else if(this.attachmentInfo.type === 'code') {
} else if (this.attachmentInfo.type === 'code') {
const codeBlock = this.$('.attachment__code');
codeBlock.addClass('language-' + this.attachment.type.split('/').pop());
highlight.highlightBlock(codeBlock[0]);
}
}

onDestroy() {
router.setSearch({attachment: null});
router.setSearch({ attachment: null });
}

@on('click .attachment__media-container')
Expand All @@ -40,12 +47,12 @@ class AttachmentView extends View {
if (el.hasClass('attachment__media-container_fullscreen')) {
this.onDestroy();
} else {
router.setSearch({attachment: this.attachment.uid});
router.setSearch({ attachment: this.attachment.uid });
}
}

loadContent() {
return $.ajax(this.sourceUrl, {dataType: 'text'}).then((responseText) => {
return $.ajax(this.sourceUrl, { dataType: 'text' }).then(responseText => {
const parser = this.attachmentInfo.parser;
this.content = parser(responseText);
});
Expand All @@ -61,7 +68,7 @@ class AttachmentView extends View {
content: this.content,
sourceUrl: this.sourceUrl,
attachment: this.attachment,
fullScreen: this.fullScreen
fullScreen: this.fullScreen,
};
}
}
Expand Down
21 changes: 14 additions & 7 deletions allure-generator/src/main/javascript/utils/attachmentType.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
import {csvParseRows, tsvParseRows} from 'd3-dsv';
import { csvParseRows, tsvParseRows } from 'd3-dsv';
import pluginsRegistry from './pluginsRegistry';

export default function typeByMime(type) {
if (pluginsRegistry.attachmentViews[type]) {
return {
type: 'custom',
...pluginsRegistry.attachmentViews[type]
};
}
switch (type) {
case 'image/bmp':
case 'image/gif':
Expand Down Expand Up @@ -67,12 +74,12 @@ export default function typeByMime(type) {
type: 'uri',
icon: 'fa fa-list-alt',
parser: d => d.split('\n')
.map(line => line.trim())
.filter(line => line.length > 0)
.map(line => ({
comment: line.indexOf('#') === 0,
text: line
}))
.map(line => line.trim())
.filter(line => line.length > 0)
.map(line => ({
comment: line.indexOf('#') === 0,
text: line
}))
};
case 'application/x-tar':
case 'application/x-gtar':
Expand Down
23 changes: 14 additions & 9 deletions allure-generator/src/main/javascript/utils/pluginsRegistry.js
Original file line number Diff line number Diff line change
@@ -1,25 +1,26 @@
import {addTranslation} from './translation';
import { addTranslation } from './translation';
import router from '../router';
import {showView, notFound} from '../app';
import { showView, notFound } from '../app';
import translate from '../helpers/t.js';
import WidgetsModel from '../data/widgets/WidgetsModel';


class AllurePluginsRegistry {
tabs = [];
testResultTabs = [];

attachmentViews = {};

testResultBlocks = {
tag: [],
before: [],
after: []
after: [],
};

widgets = {};

addTab(tabName, {title, icon, route, onEnter = notFound} = {}) {
addTab(tabName, { title, icon, route, onEnter = notFound } = {}) {
title = title || tabName;
this.tabs.push({tabName, title, icon});
this.tabs.push({ tabName, title, icon });
router.route(route, tabName);
router.on('route:' + tabName, showView(onEnter));
}
Expand All @@ -28,7 +29,7 @@ class AllurePluginsRegistry {
if (!this.widgets[tabName]) {
this.widgets[tabName] = {};
}
this.widgets[tabName][widgetName] = {widget, model};
this.widgets[tabName][widgetName] = { widget, model };
}

addTranslation(lang, json) {
Expand All @@ -39,12 +40,16 @@ class AllurePluginsRegistry {
return translate(name, options);
}

addTestResultBlock(view, {position}) {
addTestResultBlock(view, { position }) {
this.testResultBlocks[position].push(view);
}

addAttachmentViewer(mimeType, { View, icon = 'fa fa-file-o' }) {
this.attachmentViews[mimeType] = { View, icon };
}

addTestResultTab(id, name, View) {
this.testResultTabs.push({id, name, View});
this.testResultTabs.push({ id, name, View });
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"expected": "data:image/png;base64,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",
"actual": "data:image/png;base64,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",
"diff": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAowAAABnCAMAAAC98eOMAAAABlBMVEUA////AAAPnkxfAAAAAXRSTlMAQObYZgAAANtJREFUeNrt2UEKgzAQQFGtvf+VpztpYUhSO1EL763E5fDJEF0WAAAAAAAAAAAAAAAAAAAAAIApViPgx35CjJwXXKTPez5VNT7Nmn6O0Ty7Pt8eT/Nh0nTEnttauJOtaY5WEmmLtWtajIzWmJ2LLjBccmueu6PFyDehTG7RBYa7Hb9gTfPnF5jSJS5GBltsfGYsOjfFyGiLSY1ZPv7AcEKLb/9iptjMmm6M0dmk1jT3umyHMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATS96Ox8boz++DgAAAABJRU5ErkJggg=="
}

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Loading

0 comments on commit 04a3079

Please sign in to comment.