[MOV] test_website, web_editor: move test to right module
Some web_editor test was in "test_website" when it could have simply been in web_editor. It is moved there and modified to reuse existing imports and pass standard web linting rules. task-3741858 closes odoo/odoo#155704 Signed-off-by: David Monjoie (dmo) <dmo@odoo.com>
This commit is contained in:
@@ -43,9 +43,6 @@ models which only purpose is to run tests.""",
|
|||||||
'web.assets_tests': [
|
'web.assets_tests': [
|
||||||
'test_website/static/tests/tours/*',
|
'test_website/static/tests/tours/*',
|
||||||
],
|
],
|
||||||
'web.qunit_suite_tests': [
|
|
||||||
'test_website/static/tests/*.js',
|
|
||||||
],
|
|
||||||
},
|
},
|
||||||
'license': 'LGPL-3',
|
'license': 'LGPL-3',
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,168 +0,0 @@
|
|||||||
/** @odoo-module **/
|
|
||||||
|
|
||||||
import { FileSelectorControlPanel } from '@web_editor/components/media_dialog/file_selector';
|
|
||||||
import { getFixture, patchWithCleanup } from "@web/../tests/helpers/utils";
|
|
||||||
import { HtmlField } from '@web_editor/js/backend/html_field';
|
|
||||||
import {registry} from '@web/core/registry';
|
|
||||||
import testUtils from '@web/../tests/legacy/helpers/test_utils';
|
|
||||||
import { uploadService } from '@web_editor/components/upload_progress_toast/upload_service';
|
|
||||||
import { unsplashService } from '@web_unsplash/services/unsplash_service';
|
|
||||||
import { createWebClient, doAction } from "@web/../tests/webclient/helpers";
|
|
||||||
import { click } from "@web/../tests/utils";
|
|
||||||
import weTestUtils from '@web_editor/../tests/test_utils';
|
|
||||||
import {Wysiwyg} from '@web_editor/js/wysiwyg/wysiwyg';
|
|
||||||
import { useEffect } from "@odoo/owl";
|
|
||||||
|
|
||||||
QUnit.module('field html file upload', {
|
|
||||||
beforeEach: function () {
|
|
||||||
this.data = weTestUtils.wysiwygData({
|
|
||||||
'mail.compose.message': {
|
|
||||||
fields: {
|
|
||||||
display_name: {
|
|
||||||
string: "Displayed name",
|
|
||||||
type: "char"
|
|
||||||
},
|
|
||||||
body: {
|
|
||||||
string: "Message Body inline (to send)",
|
|
||||||
type: "html"
|
|
||||||
},
|
|
||||||
attachment_ids: {
|
|
||||||
string: "Attachments",
|
|
||||||
type: "many2many",
|
|
||||||
relation: "ir.attachment",
|
|
||||||
}
|
|
||||||
},
|
|
||||||
records: [{
|
|
||||||
id: 1,
|
|
||||||
display_name: "Some Composer",
|
|
||||||
body: "Hello",
|
|
||||||
attachment_ids: [],
|
|
||||||
}],
|
|
||||||
},
|
|
||||||
});
|
|
||||||
},
|
|
||||||
}, function () {
|
|
||||||
QUnit.test('media dialog: upload', async function (assert) {
|
|
||||||
assert.expect(8);
|
|
||||||
const onAttachmentChangeTriggered = testUtils.makeTestPromise();
|
|
||||||
patchWithCleanup(HtmlField.prototype, {
|
|
||||||
_onAttachmentChange(event) {
|
|
||||||
super._onAttachmentChange(event);
|
|
||||||
onAttachmentChangeTriggered.resolve(true);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
const defFileSelector = testUtils.makeTestPromise();
|
|
||||||
const onChangeTriggered = testUtils.makeTestPromise();
|
|
||||||
const webSaveTriggered = testUtils.makeTestPromise();
|
|
||||||
patchWithCleanup(FileSelectorControlPanel.prototype, {
|
|
||||||
setup() {
|
|
||||||
super.setup();
|
|
||||||
useEffect(() => {
|
|
||||||
defFileSelector.resolve(true);
|
|
||||||
}, () => []);
|
|
||||||
},
|
|
||||||
async onChangeFileInput() {
|
|
||||||
super.onChangeFileInput();
|
|
||||||
onChangeTriggered.resolve(true);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
patchWithCleanup(Wysiwyg.prototype, {
|
|
||||||
async _getColorpickerTemplate() {
|
|
||||||
return weTestUtils.COLOR_PICKER_TEMPLATE;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// create and load form view
|
|
||||||
const serviceRegistry = registry.category("services");
|
|
||||||
serviceRegistry.add("upload", uploadService);
|
|
||||||
serviceRegistry.add("unsplash", unsplashService);
|
|
||||||
const serverData = {
|
|
||||||
models: this.data,
|
|
||||||
};
|
|
||||||
serverData.actions = {
|
|
||||||
1: {
|
|
||||||
id: 1,
|
|
||||||
name: "test",
|
|
||||||
res_model: "mail.compose.message",
|
|
||||||
type: "ir.actions.act_window",
|
|
||||||
views: [[false, "form"]],
|
|
||||||
},
|
|
||||||
};
|
|
||||||
serverData.views = {
|
|
||||||
"mail.compose.message,false,search": "<search></search>",
|
|
||||||
"mail.compose.message,false,form": `
|
|
||||||
<form>
|
|
||||||
<field name="body" type="html"/>
|
|
||||||
<field name="attachment_ids" widget="many2many_binary"/>
|
|
||||||
</form>`,
|
|
||||||
};
|
|
||||||
const mockRPC = (route, args) => {
|
|
||||||
if (args.method === "web_save") {
|
|
||||||
const createVals = args.args[1];
|
|
||||||
assert.ok(createVals && createVals.attachment_ids);
|
|
||||||
assert.equal(createVals.attachment_ids[0][0], 4); // link command
|
|
||||||
assert.equal(createVals.attachment_ids[0][1], 5); // on attachment id "5"
|
|
||||||
webSaveTriggered.resolve();
|
|
||||||
}
|
|
||||||
if (route === "/web_editor/attachment/add_data") {
|
|
||||||
const attachment = {
|
|
||||||
id: 5,
|
|
||||||
name: "test.jpg",
|
|
||||||
description: false,
|
|
||||||
mimetype: "image/jpeg",
|
|
||||||
checksum: "7951a43bbfb08fd742224ada280913d1897b89ab",
|
|
||||||
url: false,
|
|
||||||
type: "binary",
|
|
||||||
res_id: 0,
|
|
||||||
res_model: "mail.compose.message",
|
|
||||||
public: false,
|
|
||||||
access_token: false,
|
|
||||||
image_src: "/web/image/1-a0e63e61/test.jpg",
|
|
||||||
image_width: 1,
|
|
||||||
image_height: 1,
|
|
||||||
original_id: false,
|
|
||||||
};
|
|
||||||
serverData.models['ir.attachment'].records.push({...attachment});
|
|
||||||
return Promise.resolve(attachment);
|
|
||||||
} else if (route === "/web/dataset/call_kw/ir.attachment/generate_access_token") {
|
|
||||||
return Promise.resolve(["129a52e1-6bf2-470a-830e-8e368b022e13"]);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
const webClient = await createWebClient({ serverData, mockRPC });
|
|
||||||
await doAction(webClient, 1);
|
|
||||||
//trigger wysiwyg mediadialog
|
|
||||||
const fixture = getFixture();
|
|
||||||
const formField = fixture.querySelector('.o_field_html[name="body"]');
|
|
||||||
const textInput = formField.querySelector('.note-editable p');
|
|
||||||
textInput.innerText = "test";
|
|
||||||
const pText = $(textInput).contents()[0];
|
|
||||||
Wysiwyg.setRange(pText, 1, pText, 2);
|
|
||||||
await new Promise((resolve) => setTimeout(resolve)); //ensure fully set up
|
|
||||||
const wysiwyg = $(textInput.parentElement).data('wysiwyg');
|
|
||||||
wysiwyg.openMediaDialog();
|
|
||||||
assert.ok(await Promise.race([defFileSelector, new Promise((res, _) => setTimeout(() => res(false), 400))]), "File Selector did not mount");
|
|
||||||
// upload test
|
|
||||||
const fileInputs = document.querySelectorAll(".o_select_media_dialog input.d-none.o_file_input");
|
|
||||||
const fileB64 = '/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAABAAEDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iiigD//2Q==';
|
|
||||||
const fileBytes = new Uint8Array(atob(fileB64).split('').map(char => char.charCodeAt(0)));
|
|
||||||
// redefine 'files' so we can put mock data in through js
|
|
||||||
fileInputs.forEach((input) => Object.defineProperty(input, 'files', {
|
|
||||||
value: [new File(fileBytes, "test.jpg", { type: 'image/jpeg' })],
|
|
||||||
}));
|
|
||||||
fileInputs.forEach(input => {
|
|
||||||
input.dispatchEvent(new Event('change', {}));
|
|
||||||
});
|
|
||||||
|
|
||||||
assert.ok(await Promise.race([onChangeTriggered, new Promise((res, _) => setTimeout(() => res(false), 400))]),
|
|
||||||
"File change event was not triggered");
|
|
||||||
assert.ok(await Promise.race([onAttachmentChangeTriggered, new Promise((res, _) => setTimeout(() => res(false), 400))]),
|
|
||||||
"_onAttachmentChange was not called with the new attachment, necessary for unsused upload cleanup on backend");
|
|
||||||
|
|
||||||
// wait to check that dom is properly updated
|
|
||||||
await new Promise((res, _) => setTimeout(() => res(false), 400));
|
|
||||||
assert.ok(fixture.querySelector('.o_attachment[title="test.jpg"]'));
|
|
||||||
|
|
||||||
await click(".o_form_button_save");
|
|
||||||
await webSaveTriggered;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@@ -1,14 +1,18 @@
|
|||||||
/** @odoo-module **/
|
/** @odoo-module **/
|
||||||
|
|
||||||
import { click, editInput, getFixture, makeDeferred, mockSendBeacon, nextTick, patchWithCleanup } from "@web/../tests/helpers/utils";
|
import { click, editInput, getFixture, makeDeferred, mockSendBeacon, nextTick, patchWithCleanup } from "@web/../tests/helpers/utils";
|
||||||
|
import { createWebClient, doAction } from "@web/../tests/webclient/helpers";
|
||||||
import { makeView, setupViewRegistries } from "@web/../tests/views/helpers";
|
import { makeView, setupViewRegistries } from "@web/../tests/views/helpers";
|
||||||
|
import { FileSelectorControlPanel } from "@web_editor/components/media_dialog/file_selector";
|
||||||
import { FormController } from '@web/views/form/form_controller';
|
import { FormController } from '@web/views/form/form_controller';
|
||||||
import { HtmlField } from "@web_editor/js/backend/html_field";
|
import { HtmlField } from "@web_editor/js/backend/html_field";
|
||||||
import { MediaDialog } from "@web_editor/components/media_dialog/media_dialog";
|
import { MediaDialog } from "@web_editor/components/media_dialog/media_dialog";
|
||||||
import { parseHTML, setSelection } from "@web_editor/js/editor/odoo-editor/src/utils/utils";
|
import { parseHTML, setSelection } from "@web_editor/js/editor/odoo-editor/src/utils/utils";
|
||||||
import { onRendered } from "@odoo/owl";
|
import { onRendered, useEffect } from "@odoo/owl";
|
||||||
import { wysiwygData } from "@web_editor/../tests/test_utils";
|
import { registry } from "@web/core/registry";
|
||||||
|
import { COLOR_PICKER_TEMPLATE, wysiwygData } from "@web_editor/../tests/test_utils";
|
||||||
import { OdooEditor } from '@web_editor/js/editor/odoo-editor/src/OdooEditor';
|
import { OdooEditor } from '@web_editor/js/editor/odoo-editor/src/OdooEditor';
|
||||||
|
import { uploadService } from "@web_editor/components/upload_progress_toast/upload_service";
|
||||||
import { Wysiwyg } from "@web_editor/js/wysiwyg/wysiwyg";
|
import { Wysiwyg } from "@web_editor/js/wysiwyg/wysiwyg";
|
||||||
import { insertText } from '@web_editor/js/editor/odoo-editor/test/utils';
|
import { insertText } from '@web_editor/js/editor/odoo-editor/test/utils';
|
||||||
|
|
||||||
@@ -1056,3 +1060,194 @@ QUnit.module("WebEditor.HtmlField", ({ beforeEach }) => {
|
|||||||
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
export const mediaDialogServices = {
|
||||||
|
upload: uploadService,
|
||||||
|
};
|
||||||
|
|
||||||
|
export const uploadTestModule = QUnit.module(
|
||||||
|
"WebEditor.HtmlField.upload",
|
||||||
|
{
|
||||||
|
beforeEach: function () {
|
||||||
|
this.data = wysiwygData({
|
||||||
|
"mail.compose.message": {
|
||||||
|
fields: {
|
||||||
|
display_name: {
|
||||||
|
string: "Displayed name",
|
||||||
|
type: "char",
|
||||||
|
},
|
||||||
|
body: {
|
||||||
|
string: "Message Body inline (to send)",
|
||||||
|
type: "html",
|
||||||
|
},
|
||||||
|
attachment_ids: {
|
||||||
|
string: "Attachments",
|
||||||
|
type: "many2many",
|
||||||
|
relation: "ir.attachment",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
records: [
|
||||||
|
{
|
||||||
|
id: 1,
|
||||||
|
display_name: "Some Composer",
|
||||||
|
body: "Hello",
|
||||||
|
attachment_ids: [],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
});
|
||||||
|
},
|
||||||
|
},
|
||||||
|
function () {
|
||||||
|
QUnit.test("media dialog: upload", async function (assert) {
|
||||||
|
assert.expect(7);
|
||||||
|
const onAttachmentChangeTriggered = makeDeferred();
|
||||||
|
patchWithCleanup(HtmlField.prototype, {
|
||||||
|
_onAttachmentChange(event) {
|
||||||
|
super._onAttachmentChange(event);
|
||||||
|
onAttachmentChangeTriggered.resolve(true);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
const defFileSelector = makeDeferred();
|
||||||
|
const onChangeTriggered = makeDeferred();
|
||||||
|
const webSaveTriggered = makeDeferred();
|
||||||
|
patchWithCleanup(FileSelectorControlPanel.prototype, {
|
||||||
|
setup() {
|
||||||
|
super.setup();
|
||||||
|
useEffect(
|
||||||
|
() => {
|
||||||
|
defFileSelector.resolve(true);
|
||||||
|
},
|
||||||
|
() => [],
|
||||||
|
);
|
||||||
|
},
|
||||||
|
async onChangeFileInput() {
|
||||||
|
super.onChangeFileInput();
|
||||||
|
onChangeTriggered.resolve(true);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
patchWithCleanup(Wysiwyg.prototype, {
|
||||||
|
async _getColorpickerTemplate() {
|
||||||
|
return COLOR_PICKER_TEMPLATE;
|
||||||
|
},
|
||||||
|
});
|
||||||
|
// create and load form view
|
||||||
|
const serviceRegistry = registry.category("services");
|
||||||
|
for (const [serviceName, serviceDefinition] of Object.entries(mediaDialogServices)) {
|
||||||
|
serviceRegistry.add(serviceName, serviceDefinition);
|
||||||
|
}
|
||||||
|
const serverData = {
|
||||||
|
models: this.data,
|
||||||
|
};
|
||||||
|
serverData.actions = {
|
||||||
|
1: {
|
||||||
|
id: 1,
|
||||||
|
name: "test",
|
||||||
|
res_model: "mail.compose.message",
|
||||||
|
type: "ir.actions.act_window",
|
||||||
|
views: [[false, "form"]],
|
||||||
|
},
|
||||||
|
};
|
||||||
|
serverData.views = {
|
||||||
|
"mail.compose.message,false,search": "<search></search>",
|
||||||
|
"mail.compose.message,false,form": `
|
||||||
|
<form>
|
||||||
|
<field name="body" type="html"/>
|
||||||
|
<field name="attachment_ids" widget="many2many_binary"/>
|
||||||
|
</form>`,
|
||||||
|
};
|
||||||
|
const mockRPC = (route, args) => {
|
||||||
|
if (args.method === "web_save") {
|
||||||
|
const createVals = args.args[1];
|
||||||
|
assert.ok(createVals && createVals.attachment_ids);
|
||||||
|
assert.equal(createVals.attachment_ids[0][0], 4); // link command
|
||||||
|
assert.equal(createVals.attachment_ids[0][1], 5); // on attachment id "5"
|
||||||
|
webSaveTriggered.resolve();
|
||||||
|
}
|
||||||
|
if (route === "/web_editor/attachment/add_data") {
|
||||||
|
const attachment = {
|
||||||
|
id: 5,
|
||||||
|
name: "test.jpg",
|
||||||
|
description: false,
|
||||||
|
mimetype: "image/jpeg",
|
||||||
|
checksum: "7951a43bbfb08fd742224ada280913d1897b89ab",
|
||||||
|
url: false,
|
||||||
|
type: "binary",
|
||||||
|
res_id: 0,
|
||||||
|
res_model: "mail.compose.message",
|
||||||
|
public: false,
|
||||||
|
access_token: false,
|
||||||
|
image_src: "/web/image/1-a0e63e61/test.jpg",
|
||||||
|
image_width: 1,
|
||||||
|
image_height: 1,
|
||||||
|
original_id: false,
|
||||||
|
};
|
||||||
|
serverData.models["ir.attachment"].records.push({ ...attachment });
|
||||||
|
return Promise.resolve(attachment);
|
||||||
|
} else if (route === "/web/dataset/call_kw/ir.attachment/generate_access_token") {
|
||||||
|
return Promise.resolve(["129a52e1-6bf2-470a-830e-8e368b022e13"]);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const webClient = await createWebClient({ serverData, mockRPC });
|
||||||
|
await doAction(webClient, 1);
|
||||||
|
//trigger wysiwyg mediadialog
|
||||||
|
const fixture = getFixture();
|
||||||
|
const formField = fixture.querySelector('.o_field_html[name="body"]');
|
||||||
|
const textInput = formField.querySelector(".note-editable p");
|
||||||
|
textInput.innerText = "test";
|
||||||
|
const pText = $(textInput).contents()[0];
|
||||||
|
Wysiwyg.setRange(pText, 1, pText, 2);
|
||||||
|
await new Promise((resolve) => setTimeout(resolve)); //ensure fully set up
|
||||||
|
const wysiwyg = $(textInput.parentElement).data("wysiwyg");
|
||||||
|
wysiwyg.openMediaDialog();
|
||||||
|
assert.ok(
|
||||||
|
await Promise.race([
|
||||||
|
defFileSelector,
|
||||||
|
new Promise((res, _) => setTimeout(() => res(false), 400)),
|
||||||
|
]),
|
||||||
|
"File Selector did not mount",
|
||||||
|
);
|
||||||
|
// upload test
|
||||||
|
const fileInputs = document.querySelectorAll(
|
||||||
|
".o_select_media_dialog input.d-none.o_file_input",
|
||||||
|
);
|
||||||
|
const fileB64 =
|
||||||
|
"/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAABAAEDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iiigD//2Q==";
|
||||||
|
const fileBytes = new Uint8Array(
|
||||||
|
atob(fileB64)
|
||||||
|
.split("")
|
||||||
|
.map((char) => char.charCodeAt(0)),
|
||||||
|
);
|
||||||
|
// redefine 'files' so we can put mock data in through js
|
||||||
|
fileInputs.forEach((input) =>
|
||||||
|
Object.defineProperty(input, "files", {
|
||||||
|
value: [new File(fileBytes, "test.jpg", { type: "image/jpeg" })],
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
fileInputs.forEach((input) => {
|
||||||
|
input.dispatchEvent(new Event("change", {}));
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.ok(
|
||||||
|
await Promise.race([
|
||||||
|
onChangeTriggered,
|
||||||
|
new Promise((res, _) => setTimeout(() => res(false), 400)),
|
||||||
|
]),
|
||||||
|
"File change event was not triggered",
|
||||||
|
);
|
||||||
|
assert.ok(
|
||||||
|
await Promise.race([
|
||||||
|
onAttachmentChangeTriggered,
|
||||||
|
new Promise((res, _) => setTimeout(() => res(false), 400)),
|
||||||
|
]),
|
||||||
|
"_onAttachmentChange was not called with the new attachment, necessary for unsused upload cleanup on backend"
|
||||||
|
);
|
||||||
|
// wait to check that dom is properly updated
|
||||||
|
await new Promise((res, _) => setTimeout(() => res(false), 400));
|
||||||
|
assert.ok(fixture.querySelector('.o_attachment[title="test.jpg"]'));
|
||||||
|
|
||||||
|
await click(fixture.querySelector(".o_form_button_save"));
|
||||||
|
await webSaveTriggered;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import { Wysiwyg } from '@web_editor/js/wysiwyg/wysiwyg';
|
|||||||
import options from "@web_editor/js/editor/snippets.options";
|
import options from "@web_editor/js/editor/snippets.options";
|
||||||
import { TABLE_ATTRIBUTES, TABLE_STYLES } from '@web_editor/js/backend/convert_inline';
|
import { TABLE_ATTRIBUTES, TABLE_STYLES } from '@web_editor/js/backend/convert_inline';
|
||||||
|
|
||||||
const COLOR_PICKER_TEMPLATE = `
|
export const COLOR_PICKER_TEMPLATE = `
|
||||||
<colorpicker>
|
<colorpicker>
|
||||||
<div class="o_colorpicker_section" data-name="theme" data-display="Theme Colors" data-icon-class="fa fa-flask">
|
<div class="o_colorpicker_section" data-name="theme" data-display="Theme Colors" data-icon-class="fa fa-flask">
|
||||||
<button data-color="o-color-1"/>
|
<button data-color="o-color-1"/>
|
||||||
|
|||||||
@@ -20,6 +20,9 @@
|
|||||||
'web_unsplash/static/src/components/media_dialog/*.xml',
|
'web_unsplash/static/src/components/media_dialog/*.xml',
|
||||||
'web_unsplash/static/src/services/unsplash_service.js',
|
'web_unsplash/static/src/services/unsplash_service.js',
|
||||||
],
|
],
|
||||||
|
'web.qunit_suite_tests': [
|
||||||
|
'web_unsplash/static/tests/**/*',
|
||||||
|
],
|
||||||
},
|
},
|
||||||
'license': 'LGPL-3',
|
'license': 'LGPL-3',
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
/** @odoo-module **/
|
||||||
|
|
||||||
|
import { unsplashService } from "@web_unsplash/services/unsplash_service";
|
||||||
|
import { mediaDialogServices } from "@web_editor/../tests/html_field_tests";
|
||||||
|
|
||||||
|
// update the list of required services to open the media dialog
|
||||||
|
mediaDialogServices.unsplash = unsplashService;
|
||||||
Reference in New Issue
Block a user