summaryrefslogtreecommitdiff
path: root/addons/partner_autocomplete/static/tests
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/partner_autocomplete/static/tests
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/partner_autocomplete/static/tests')
-rw-r--r--addons/partner_autocomplete/static/tests/partner_autocomplete_tests.js421
1 files changed, 421 insertions, 0 deletions
diff --git a/addons/partner_autocomplete/static/tests/partner_autocomplete_tests.js b/addons/partner_autocomplete/static/tests/partner_autocomplete_tests.js
new file mode 100644
index 00000000..7b07bd99
--- /dev/null
+++ b/addons/partner_autocomplete/static/tests/partner_autocomplete_tests.js
@@ -0,0 +1,421 @@
+odoo.define('partner_autocomplete.tests', function (require) {
+ "use strict";
+
+ var FormView = require('web.FormView');
+ var concurrency = require('web.concurrency');
+ var testUtils = require("web.test_utils");
+ var AutocompleteField = require('partner.autocomplete.fieldchar');
+ var PartnerField = require('partner.autocomplete.many2one');
+ var NotificationService = require('web.NotificationService');
+
+ var createView = testUtils.createView;
+
+ function _compareResultFields(assert, form, fields, createData) {
+ var type, formatted, $fieldInput;
+
+ _.each(createData, function (val, key) {
+ if (fields[key]) {
+ if (key === 'image_1920') {
+ if (val) val = 'data:image/png;base64,' + val;
+ assert.hasAttrValue(form.$(".o_field_image img"), "data-src", val, 'image value should have been updated to "' + val + '"');
+ } else {
+ type = fields[key].type;
+ $fieldInput = form.$('input[name="' + key + '"]');
+ if ($fieldInput.length) {
+ formatted = $fieldInput.val();
+ formatted = type === 'integer' ? parseInt(formatted, 10) : formatted;
+ assert.strictEqual(
+ formatted,
+ val === false ? 0 : val,
+ key + ' value should have been updated to "' + val + '"'
+ );
+ }
+
+ }
+ }
+ });
+ }
+
+ var suggestions = [{
+ name: "Odoo",
+ website: "odoo.com",
+ domain: "odoo.com",
+ logo: "odoo.com/logo.png",
+ vat: "BE0477472701"
+ }];
+
+ var enrichData = {};
+
+ var createData = {};
+
+ QUnit.module('partner_autocomplete', {
+ before: function () {
+ var fieldsToPatch = [PartnerField, AutocompleteField];
+ _.each(fieldsToPatch, function (fieldToPatch) {
+ testUtils.mock.patch(fieldToPatch, {
+ _getBase64Image: function (url) {
+ return Promise.resolve(url === "odoo.com/logo.png" ? "odoobase64" : "");
+ },
+ _isOnline: function () {
+ return true;
+ },
+ _getCreateData: function (company) {
+ var def = this._super.apply(this, arguments);
+ def.then(function (data) {
+ createData = data.company;
+ });
+ return def;
+ },
+ _enrichCompany: function (company) {
+ return Promise.resolve(enrichData);
+ },
+ _getOdooSuggestions: function (value, isVAT) {
+ var results = _.filter(suggestions, function (suggestion) {
+ value = value ? value.toLowerCase() : '';
+ if (isVAT) return (suggestion.vat.toLowerCase().indexOf(value) >= 0);
+ else return (suggestion.name.toLowerCase().indexOf(value) >= 0);
+ });
+ return Promise.resolve(results);
+ },
+ _getClearbitSuggestions: function (value) {
+ return this._getOdooSuggestions(value);
+ },
+ do_notify: function (title, message, sticky, className) {
+ return this.displayNotification({
+ type: 'warning',
+ title: title,
+ message: message,
+ sticky: sticky,
+ className: 'o_partner_autocomplete_test_notify'
+ });
+ },
+ });
+ });
+
+ testUtils.mock.patch(AutocompleteField, {
+ debounceSuggestions: 0,
+ });
+ },
+ beforeEach: function () {
+ enrichData = {
+ country_id: 20,
+ state_id: false,
+ partner_gid: 1,
+ website: "odoo.com",
+ comment: "Comment on Odoo",
+ street: "40 Chaussée de Namur",
+ city: "Ramillies",
+ zip: "1367",
+ phone: "+1 650-691-3277",
+ vat: "BE0477472701",
+ };
+
+ this.data = {
+ 'res.partner': {
+ fields: {
+ company_type: {
+ string: "Company Type",
+ type: "selection",
+ selection: [["company", "Company"], ["individual", "Individual"]],
+ searchable: true
+ },
+ name: {string: "Name", type: "char", searchable: true},
+ parent_id: {string: "Company", type: "many2one", relation: "res.partner"},
+ website: {string: "Website", type: "char", searchable: true},
+ image_1920: {string: "Image", type: "binary", searchable: true},
+ phone: {string: "Phone", type: "char", searchable: true},
+ street: {string: "Street", type: "char", searchable: true},
+ city: {string: "City", type: "char", searchable: true},
+ zip: {string: "Zip", type: "char", searchable: true},
+ state_id: {string: "State", type: "integer", searchable: true},
+ country_id: {string: "Country", type: "integer", searchable: true},
+ comment: {string: "Comment", type: "char", searchable: true},
+ vat: {string: "Vat", type: "char", searchable: true},
+ is_company: {string: "Is comapny", type: "bool", searchable: true},
+ partner_gid: {string: "Company data ID", type: "integer", searchable: true},
+ },
+ records: [],
+ onchanges: {
+ company_type: function (obj) {
+ obj.is_company = obj.company_type === 'company';
+ },
+ },
+ },
+ };
+ },
+ after: function () {
+ testUtils.mock.unpatch(AutocompleteField);
+ testUtils.mock.unpatch(PartnerField);
+ },
+ });
+
+ QUnit.test("Partner autocomplete : Company type = Individual", function (assert) {
+ assert.expect(2);
+ var done = assert.async();
+ createView({
+ View: FormView,
+ model: 'res.partner',
+ data: this.data,
+ arch:
+ '<form>' +
+ '<field name="company_type"/>' +
+ '<field name="name" widget="field_partner_autocomplete"/>' +
+ '<field name="website"/>' +
+ '<field name="image_1920" widget="image"/>' +
+ '</form>',
+ }).then(function (form){
+ // Set company type to Individual
+ var $company_type = form.$("select[name='company_type']");
+ testUtils.fields.editSelect($company_type, '"individual"');
+
+ // Check input exists
+ var $input = form.$(".o_field_partner_autocomplete > input:visible");
+ assert.strictEqual($input.length, 1, "there should be an <input/> for the Partner field");
+
+ // Change input val and assert nothing happens
+ testUtils.fields.editInput($input, "odoo")
+ var $dropdown = form.$(".o_field_partner_autocomplete .dropdown-menu:visible");
+ assert.strictEqual($dropdown.length, 0, "there should not be an opened dropdown");
+
+ form.destroy();
+
+ done();
+ });
+ });
+
+
+ QUnit.test("Partner autocomplete : Company type = Company / Name search", async function (assert) {
+ assert.expect(17);
+ var fields = this.data['res.partner'].fields;
+ var form = await createView({
+ View: FormView,
+ model: 'res.partner',
+ data: this.data,
+ arch:
+ '<form>' +
+ '<field name="company_type"/>' +
+ '<field name="name" widget="field_partner_autocomplete"/>' +
+ '<field name="website"/>' +
+ '<field name="image_1920" widget="image"/>' +
+ '<field name="phone"/>' +
+ '<field name="street"/>' +
+ '<field name="city"/>' +
+ '<field name="state_id"/>' +
+ '<field name="zip"/>' +
+ '<field name="country_id"/>' +
+ '<field name="comment"/>' +
+ '<field name="vat"/>' +
+ '</form>',
+ mockRPC: function (route) {
+ if (route === "/web/static/src/img/placeholder.png"
+ || route === "odoo.com/logo.png"
+ || route === "data:image/png;base64,odoobase64") { // land here as it is not valid base64 content
+ return Promise.resolve();
+ }
+ return this._super.apply(this, arguments);
+ },
+ });
+ // Set company type to Company
+ var $company_type = form.$("select[name='company_type']");
+ await testUtils.fields.editSelect($company_type, '"company"');
+
+ // Check input exists
+ var $input = form.$(".o_field_partner_autocomplete > input:visible");
+ assert.strictEqual($input.length, 1, "there should be an <input/> for the field");
+
+ // Change input val and assert changes
+ await testUtils.fields.editInput($input, "odoo");
+ await testUtils.nextTick();
+ var $dropdown = form.$(".o_field_partner_autocomplete .dropdown-menu:visible");
+ assert.strictEqual($dropdown.length, 1, "there should be an opened dropdown");
+ assert.strictEqual($dropdown.children().length, 1, "there should be only ne proposition");
+
+ await testUtils.dom.click($dropdown.find("a").first());
+ $input = form.$(".o_field_partner_autocomplete > input");
+ assert.strictEqual($input.val(), "Odoo", "Input value should have been updated to \"Odoo\"");
+ assert.strictEqual(form.$("input.o_field_widget").val(), "odoo.com", "website value should have been updated to \"odoo.com\"");
+
+ _compareResultFields(assert, form, fields, createData);
+
+ // Try suggestion with bullshit query
+ await testUtils.fields.editInput($input, "ZZZZZZZZZZZZZZZZZZZZZZ");
+ $dropdown = form.$(".o_field_partner_autocomplete .dropdown-menu:visible");
+ assert.strictEqual($dropdown.length, 0, "there should be no opened dropdown when no result");
+
+ // Try autocomplete again
+ await testUtils.fields.editInput($input, "odoo");
+ await testUtils.nextTick();
+ $dropdown = form.$(".o_field_partner_autocomplete .dropdown-menu:visible");
+ assert.strictEqual($dropdown.length, 1, "there should be an opened dropdown when typing odoo letters again");
+
+ // Test if dropdown closes on focusout
+ $input.trigger("focusout");
+ await testUtils.nextTick();
+ $dropdown = form.$(".o_field_partner_autocomplete .dropdown-menu:visible");
+ assert.strictEqual($dropdown.length, 0, "unfocusing the input should close the dropdown");
+
+ form.destroy();
+ });
+
+ QUnit.test("Partner autocomplete : Company type = Company / VAT search", async function (assert) {
+ assert.expect(27);
+ var fields = this.data['res.partner'].fields;
+ var form = await createView({
+ View: FormView,
+ model: 'res.partner',
+ data: this.data,
+ arch:
+ '<form>' +
+ '<field name="company_type"/>' +
+ '<field name="name" widget="field_partner_autocomplete"/>' +
+ '<field name="website"/>' +
+ '<field name="image_1920" widget="image"/>' +
+ '<field name="phone"/>' +
+ '<field name="street"/>' +
+ '<field name="city"/>' +
+ '<field name="state_id"/>' +
+ '<field name="zip"/>' +
+ '<field name="country_id"/>' +
+ '<field name="comment"/>' +
+ '<field name="vat"/>' +
+ '</form>',
+ mockRPC: function (route) {
+ if (route === "/web/static/src/img/placeholder.png"
+ || route === "odoo.com/logo.png"
+ || route === "data:image/png;base64,odoobase64") { // land here as it is not valid base64 content
+ return Promise.resolve();
+ }
+ return this._super.apply(this, arguments);
+ },
+ });
+ // Set company type to Company
+ var $company_type = form.$("select[name='company_type']");
+ await testUtils.fields.editSelect($company_type, '"company"');
+
+
+ // Check input exists
+ var $input = form.$(".o_field_partner_autocomplete > input:visible");
+ assert.strictEqual($input.length, 1, "there should be an <input/> for the field");
+
+ // Set incomplete VAT and assert changes
+ await testUtils.fields.editInput($input, "BE047747270")
+
+ var $dropdown = form.$(".o_field_partner_autocomplete .dropdown-menu:visible");
+ assert.strictEqual($dropdown.length, 0, "there should be no opened dropdown no results with incomplete VAT number");
+
+ // Set complete VAT and assert changes
+ // First suggestion (only vat result)
+ await testUtils.fields.editInput($input, "BE0477472701")
+ $dropdown = form.$(".o_field_partner_autocomplete .dropdown-menu:visible");
+ assert.strictEqual($dropdown.length, 1, "there should be an opened dropdown");
+ assert.strictEqual($dropdown.children().length, 1, "there should be one proposition for complete VAT number");
+
+ await testUtils.dom.click($dropdown.find("a").first());
+
+ $input = form.$(".o_field_partner_autocomplete > input");
+ assert.strictEqual($input.val(), "Odoo", "Input value should have been updated to \"Odoo\"");
+
+ _compareResultFields(assert, form, fields, createData);
+ await testUtils.nextTick();
+ // Set complete VAT and assert changes
+ // Second suggestion (only vat + clearbit result)
+ await testUtils.fields.editInput($input, "BE0477472701")
+ $dropdown = form.$(".o_field_partner_autocomplete .dropdown-menu:visible");
+ assert.strictEqual($dropdown.length, 1, "there should be an opened dropdown");
+ assert.strictEqual($dropdown.children().length, 1, "there should be one proposition for complete VAT number");
+
+ await testUtils.dom.click($dropdown.find("a").first());
+
+ $input = form.$(".o_field_partner_autocomplete > input");
+ assert.strictEqual($input.val(), "Odoo", "Input value should have been updated to \"Odoo\"");
+
+ _compareResultFields(assert, form, fields, createData);
+
+ // Test if dropdown closes on focusout
+ $input.trigger("focusout");
+ $dropdown = form.$(".o_field_partner_autocomplete .dropdown-menu:visible");
+ assert.strictEqual($dropdown.length, 0, "unfocusing the input should close the dropdown");
+
+ form.destroy();
+
+ });
+
+ QUnit.test("Partner autocomplete : render Many2one", function (assert) {
+ var done = assert.async();
+ assert.expect(3);
+
+ var M2O_DELAY = PartnerField.prototype.AUTOCOMPLETE_DELAY;
+ PartnerField.prototype.AUTOCOMPLETE_DELAY = 0;
+
+ createView({
+ View: FormView,
+ model: 'res.partner',
+ data: this.data,
+ arch:
+ '<form>' +
+ '<field name="name"/>' +
+ '<field name="parent_id" widget="res_partner_many2one"/>' +
+ '</form>',
+ }).then(async function (form) {
+ var $input = form.$('.o_field_many2one[name="parent_id"] input:visible');
+ assert.strictEqual($input.length, 1, "there should be an <input/> for the Many2one");
+
+ await testUtils.fields.editInput($input, 'odoo');
+
+ concurrency.delay(0).then(function () {
+ var $dropdown = $input.autocomplete('widget');
+ assert.strictEqual($dropdown.length, 1, "there should be an opened dropdown");
+ assert.ok($dropdown.is('.o_partner_autocomplete_dropdown'),
+ "there should be a partner_autocomplete");
+
+ PartnerField.prototype.AUTOCOMPLETE_DELAY = M2O_DELAY;
+ form.destroy();
+
+ done();
+ });
+ });
+ });
+
+ QUnit.test("Partner autocomplete : Notify not enough credits", async function (assert) {
+ assert.expect(1);
+
+ enrichData = {
+ error: true,
+ error_message: 'Insufficient Credit',
+ };
+
+ var form = await createView({
+ View: FormView,
+ model: 'res.partner',
+ data: this.data,
+ arch:
+ '<form>' +
+ '<field name="company_type"/>' +
+ '<field name="name" widget="field_partner_autocomplete"/>' +
+ '</form>',
+ services: {
+ notification: NotificationService,
+ },
+ mockRPC: function (route, args) {
+ if (args.method === "get_credits_url"){
+ return Promise.resolve('credits_url');
+ }
+ return this._super.apply(this, arguments);
+ },
+ });
+ // Set company type to Company
+ var $company_type = form.$("select[name='company_type']");
+ await testUtils.fields.editSelect($company_type, '"company"');
+
+ var $input = form.$(".o_field_partner_autocomplete > input:visible");
+ await testUtils.fields.editInput($input, "BE0477472701");
+
+ var $dropdown = form.$(".o_field_partner_autocomplete .dropdown-menu:visible");
+ await testUtils.dom.click($dropdown.find("a").first());
+
+ var $notify = $(".o_partner_autocomplete_test_notify");
+ assert.isVisible($notify, "there should be an 'Insufficient Credit' notification");
+
+ form.destroy();
+ });
+});