forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			160 lines
		
	
	
	
		
			4.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			160 lines
		
	
	
	
		
			4.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/* This Source Code Form is subject to the terms of the Mozilla Public
 | 
						|
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 | 
						|
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | 
						|
 | 
						|
// Test the Bing Translator client against a mock Bing service, bing.sjs.
 | 
						|
 | 
						|
"use strict";
 | 
						|
 | 
						|
const kClientIdPref = "browser.translation.bing.clientIdOverride";
 | 
						|
const kClientSecretPref = "browser.translation.bing.apiKeyOverride";
 | 
						|
 | 
						|
const { BingTranslator } = ChromeUtils.import(
 | 
						|
  "resource:///modules/translation/BingTranslator.jsm"
 | 
						|
);
 | 
						|
const { TranslationDocument } = ChromeUtils.import(
 | 
						|
  "resource:///modules/translation/TranslationDocument.jsm"
 | 
						|
);
 | 
						|
 | 
						|
add_setup(async function() {
 | 
						|
  Services.prefs.setCharPref(kClientIdPref, "testClient");
 | 
						|
  Services.prefs.setCharPref(kClientSecretPref, "testSecret");
 | 
						|
 | 
						|
  registerCleanupFunction(function() {
 | 
						|
    Services.prefs.clearUserPref(kClientIdPref);
 | 
						|
    Services.prefs.clearUserPref(kClientSecretPref);
 | 
						|
  });
 | 
						|
});
 | 
						|
 | 
						|
/**
 | 
						|
 * Checks if the translation is happening.
 | 
						|
 */
 | 
						|
add_task(async function test_bing_translation() {
 | 
						|
  // Ensure the correct client id is used for authentication.
 | 
						|
  Services.prefs.setCharPref(kClientIdPref, "testClient");
 | 
						|
 | 
						|
  // Loading the fixture page.
 | 
						|
  let url = constructFixtureURL("bug1022725-fr.html");
 | 
						|
  let tab = await promiseTestPageLoad(url);
 | 
						|
 | 
						|
  // Translating the contents of the loaded tab.
 | 
						|
  gBrowser.selectedTab = tab;
 | 
						|
  let browser = tab.linkedBrowser;
 | 
						|
 | 
						|
  await SpecialPowers.spawn(browser, [], async function() {
 | 
						|
    // eslint-disable-next-line no-shadow
 | 
						|
    const { BingTranslator } = ChromeUtils.import(
 | 
						|
      "resource:///modules/translation/BingTranslator.jsm"
 | 
						|
    );
 | 
						|
    // eslint-disable-next-line no-shadow
 | 
						|
    const { TranslationDocument } = ChromeUtils.import(
 | 
						|
      "resource:///modules/translation/TranslationDocument.jsm"
 | 
						|
    );
 | 
						|
 | 
						|
    let client = new BingTranslator(
 | 
						|
      new TranslationDocument(content.document),
 | 
						|
      "fr",
 | 
						|
      "en"
 | 
						|
    );
 | 
						|
    let result = await client.translate();
 | 
						|
 | 
						|
    // XXXmikedeboer; here you would continue the test/ content inspection.
 | 
						|
    Assert.ok(result, "There should be a result");
 | 
						|
  });
 | 
						|
 | 
						|
  gBrowser.removeTab(tab);
 | 
						|
});
 | 
						|
 | 
						|
/**
 | 
						|
 * Ensures that the BingTranslator handles out-of-valid-key response
 | 
						|
 * correctly. Sometimes Bing Translate replies with
 | 
						|
 * "request credentials is not in an active state" error. BingTranslator
 | 
						|
 * should catch this error and classify it as Service Unavailable.
 | 
						|
 *
 | 
						|
 */
 | 
						|
add_task(async function test_handling_out_of_valid_key_error() {
 | 
						|
  // Simulating request from inactive subscription.
 | 
						|
  Services.prefs.setCharPref(kClientIdPref, "testInactive");
 | 
						|
 | 
						|
  // Loading the fixture page.
 | 
						|
  let url = constructFixtureURL("bug1022725-fr.html");
 | 
						|
  let tab = await promiseTestPageLoad(url);
 | 
						|
 | 
						|
  // Translating the contents of the loaded tab.
 | 
						|
  gBrowser.selectedTab = tab;
 | 
						|
  let browser = tab.linkedBrowser;
 | 
						|
 | 
						|
  await SpecialPowers.spawn(browser, [], async function() {
 | 
						|
    // eslint-disable-next-line no-shadow
 | 
						|
    const { BingTranslator } = ChromeUtils.import(
 | 
						|
      "resource:///modules/translation/BingTranslator.jsm"
 | 
						|
    );
 | 
						|
    // eslint-disable-next-line no-shadow
 | 
						|
    const { TranslationDocument } = ChromeUtils.import(
 | 
						|
      "resource:///modules/translation/TranslationDocument.jsm"
 | 
						|
    );
 | 
						|
 | 
						|
    let client = new BingTranslator(
 | 
						|
      new TranslationDocument(content.document),
 | 
						|
      "fr",
 | 
						|
      "en"
 | 
						|
    );
 | 
						|
    client._resetToken();
 | 
						|
    try {
 | 
						|
      await client.translate();
 | 
						|
    } catch (ex) {
 | 
						|
      // It is alright that the translation fails.
 | 
						|
    }
 | 
						|
    client._resetToken();
 | 
						|
 | 
						|
    // Checking if the client detected service and unavailable.
 | 
						|
    Assert.ok(
 | 
						|
      client._serviceUnavailable,
 | 
						|
      "Service should be detected unavailable."
 | 
						|
    );
 | 
						|
  });
 | 
						|
 | 
						|
  // Cleaning up.
 | 
						|
  Services.prefs.setCharPref(kClientIdPref, "testClient");
 | 
						|
  gBrowser.removeTab(tab);
 | 
						|
});
 | 
						|
 | 
						|
/**
 | 
						|
 * A helper function for constructing a URL to a page stored in the
 | 
						|
 * local fixture folder.
 | 
						|
 *
 | 
						|
 * @param filename  Name of a fixture file.
 | 
						|
 */
 | 
						|
function constructFixtureURL(filename) {
 | 
						|
  // Deduce the Mochitest server address in use from a pref that was pre-processed.
 | 
						|
  let server = Services.prefs
 | 
						|
    .getCharPref("browser.translation.bing.authURL")
 | 
						|
    .replace("http://", "");
 | 
						|
  server = server.substr(0, server.indexOf("/"));
 | 
						|
  let url =
 | 
						|
    "http://" +
 | 
						|
    server +
 | 
						|
    "/browser/browser/components/translation/test/fixtures/" +
 | 
						|
    filename;
 | 
						|
  return url;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * A helper function to open a new tab and wait for its content to load.
 | 
						|
 *
 | 
						|
 * @param String url  A URL to be loaded in the new tab.
 | 
						|
 */
 | 
						|
function promiseTestPageLoad(url) {
 | 
						|
  return new Promise(resolve => {
 | 
						|
    let tab = (gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser, url));
 | 
						|
    let browser = gBrowser.selectedBrowser;
 | 
						|
    BrowserTestUtils.browserLoaded(
 | 
						|
      browser,
 | 
						|
      false,
 | 
						|
      loadurl => loadurl != "about:blank"
 | 
						|
    ).then(() => {
 | 
						|
      info("Page loaded: " + browser.currentURI.spec);
 | 
						|
      resolve(tab);
 | 
						|
    });
 | 
						|
  });
 | 
						|
}
 |