text: odoo.define('im_support.test_utils', function (require) {
  "use strict";
  
  var mailTestUtils = require('mail.testUtils');
  var supportSession = require('im_support.SupportSession');
  
  var testUtils = require('web.test_utils');
  
  
  mailTestUtils.MockMailService.include({
      getServices: function () {
          return _.extend(this._super(), {
              support_bus_service: this.bus_service(),
          });
      },
  });
  
  /**
   * Extended version of addMockEnvironment that mocks RPCs done to the Support
   * server (CORS), and enables a longpolling to the Support server, optionally.
   *
   * @param {Widget} widget
   * @param {Object} params
   * @param {function} [params.mockSupportRPC]
   * @param {boolean} [params.enableSupportPoll=false]
   */
  function addMockSupportEnvironment(widget, params) {
      // mock CORS RPCs
      var originalRPC = supportSession.rpc;
      var defaultMockSupportRPC = function (route, args) {
          if (route === '/odoo_im_support/get_support_channel') {
              return $.when({
                  available: true,
                  channel_type: 'livechat',
                  public: 'private',
                  uuid: args.channel_uuid,
              });
          }
          if (route === '/odoo_im_support/fetch_messages') { // fetching history
              return $.when([]);
          }
          if (route === '/odoo_im_support/chat_post') {
              return $.when();
          }
          if (route === '/longpolling/support_poll') {
              return $.Deferred();
          }
      };
      supportSession.rpc = function (route, args) {
          var result;
          if (params.mockSupportRPC) {
              var _super = this._super;
              this._super = defaultMockSupportRPC.bind(this, route, args);
              result = params.mockSupportRPC.apply(this, arguments);
              this._super = _super;
          } else {
              result = defaultMockSupportRPC.apply(this, arguments);
          }
          return result;
      };
      testUtils.addMockEnvironment(widget, params);
      var widgetDestroy = widget.destroy;
      widget.destroy = function () {
          supportSession.rpc = originalRPC;
          widgetDestroy.call(this);
      };
  
      // intercepts the getItem call to localStorage service for key
      // 'im_support.poll_timeout', to simulate a pending longpolling connection to
      // the Support server, such that the initSupport initiates a poll connection
      if (params.enableSupportPoll) {
          testUtils.intercept(widget, 'call_service', function (ev) {
              if (ev.data.service === 'local_storage') {
                  if (ev.data.method === 'getItem' && ev.data.args[0] === 'im_support.poll_timeout') {
                      ev.data.callback(Date.now() + (60 * 1000));
                      // hack to prevent the default mock to handle the request and erase the above value
                      ev.data.callback = function () {};
                  }
              }
          }, true);
          // manually call initSupport (which is supposed to be called at webclient startup)
          widget.call('mail_service', 'initSupport');
      }
  }
  
  return {
      addMockSupportEnvironment: addMockSupportEnvironment,
  };
  
  });
  