title: How do I load the node.js http module from within an intern.js test?
body: <p>I am attempting to use the Intern test framework to automate testing of a simple REST API implemented with node.js and StrongLoop.  StrongLoop provides an explorer web page that I have used to validate that the REST API is implemented and I can manually test the API from Postman.  </p>
  
  <p>The first API test I am attempting with intern.js retrieves the count of media objects in a collection.  The HTTP method is GET, the URL is <code>http://localhost:3000/api/media/count</code> and the response is {"count": 2}.  </p>
  
  <p>When I run my intern.js test I receive an error "Error: Attempt to require unloaded module http".  </p>
  
  <p>I have a \tests sub-directory within my node.js application.  My test case is media.js:</p>
  
  <pre><code>define([
      'intern!object',
      'intern/chai!assert'
  ], function (registerSuite, assert, media) {
      registerSuite({
          name: 'media',
          count: function() {
          var http = require("http");
          var request = http.request;
          request({
            url: "http://localhost:3000/api/media/count",
            method: "GET"
          }, function (error, response, body) {
            console.log("Status", response.statusCode);
            console.log("Headers", JSON.stringify(response.headers));
            console.log("Response received", body);
          });
  
          assert.strictEqual(body, '{"count": 2}',
              url + ' should return 2 items');
          }
      });
  });
  </code></pre>
  
  <p>My intern.js configuration file is:</p>
  
  <pre><code>// Learn more about configuring this file at &lt;https://github.com/theintern/intern/wiki/Configuring-Intern&gt;.
  // These default settings work OK for most people. The options that *must* be changed below are the
  // packages, suites, excludeInstrumentation, and (if you want functional tests) functionalSuites.
  define({
      // The port on which the instrumenting proxy will listen
      proxyPort: 9000,
  
      // A fully qualified URL to the Intern proxy
      proxyUrl: 'http://localhost:9000/',
  
      // Default desired capabilities for all environments. Individual capabilities can be overridden by any of the
      // specified browser environments in the `environments` array below as well. See
      // https://code.google.com/p/selenium/wiki/DesiredCapabilities for standard Selenium capabilities and
      // https://saucelabs.com/docs/additional-config#desired-capabilities for Sauce Labs capabilities.
      // Note that the `build` capability will be filled in with the current commit ID from the Travis CI environment
      // automatically
      capabilities: {
          'selenium-version': '2.41.0'
      },
  
      // Browsers to run integration testing against. Note that version numbers must be strings if used with Sauce
      // OnDemand. Options that will be permutated are browserName, version, platform, and platformVersion; any other
      // capabilities options specified for an environment will be copied as-is
      environments: [
          { browserName: 'internet explorer', version: '11', platform: 'Windows 8.1' },
          { browserName: 'internet explorer', version: '10', platform: 'Windows 8' },
          { browserName: 'internet explorer', version: '9', platform: 'Windows 7' },
          { browserName: 'firefox', version: '28', platform: [ 'OS X 10.9', 'Windows 7', 'Linux' ] },
          { browserName: 'chrome', version: '34', platform: [ 'OS X 10.9', 'Windows 7', 'Linux' ] },
          { browserName: 'safari', version: '6', platform: 'OS X 10.8' },
          { browserName: 'safari', version: '7', platform: 'OS X 10.9' }
      ],
  
      // Maximum number of simultaneous integration tests that should be executed on the remote WebDriver service
      maxConcurrency: 3,
  
      // Name of the tunnel class to use for WebDriver tests
      tunnel: 'SauceLabsTunnel',
  
      // The desired AMD loader to use when running unit tests (client.html/client.js). Omit to use the default Dojo
      // loader
      useLoader: {
          'host-node': 'dojo/dojo',
          'host-browser': 'node_modules/dojo/dojo.js'
      },
  
      // Configuration options for the module loader; any AMD configuration options supported by the specified AMD loader
      // can be used here
      loader: {
          // Packages that should be registered with the loader in each testing environment
          packages: [ 
          { name: 'app', location: '.' },
          ]
      },
  
      // Non-functional test suite(s) to run in each browser
      suites: [ 'tests/media' /* 'myPackage/tests/foo', 'myPackage/tests/bar' */ ],
  
      // Functional test suite(s) to run in each browser once non-functional tests are completed
      functionalSuites: [ /* 'myPackage/tests/functional' */ ],
  
      // A regular expression matching URLs to files that should not be included in code coverage analysis
      excludeInstrumentation: /^(?:tests|node_modules)\//
  });
  </code></pre>
  
  <p>I run the test using the command `c:\Repositories\app>intern-client config=tests/intern' and the below console output is produced:</p>
  
  <pre><code>c:\Repositories\app&gt;intern-client config=tests/intern
  FAIL: main - media - count (0ms)
  Error: Attempt to require unloaded module http.request
    at contextRequire  &lt;D:\Users\username\AppData\Roaming\npm\node_modules\inte
  rn\node_modules\dojo\dojo.js:255:12&gt;
    at req  &lt;D:\Users\username\AppData\Roaming\npm\node_modules\intern\node_mod
  ules\dojo\dojo.js:30:10&gt;
    at Test.registerSuite.count [as test]  &lt;tests\media.js:23:27&gt;
    at Test.run  &lt;D:\Users\username\AppData\Roaming\npm\node_modules\intern\lib
  \Test.js:169:19&gt;
    at &lt;D:\Users\username\AppData\Roaming\npm\node_modules\intern\lib\Suite.js:
  237:13&gt;
    at signalListener  &lt;D:\Users\username\AppData\Roaming\npm\node_modules\inte
  rn\node_modules\dojo\Deferred.js:37:21&gt;
    at Promise.then.promise.then  &lt;D:\Users\username\AppData\Roaming\npm\node_m
  odules\intern\node_modules\dojo\Deferred.js:258:5&gt;
    at runTest  &lt;D:\Users\username\AppData\Roaming\npm\node_modules\intern\lib\
  Suite.js:236:46&gt;
    at &lt;D:\Users\username\AppData\Roaming\npm\node_modules\intern\lib\Suite.js:
  249:7&gt;
    at process._tickCallback  &lt;node.js:419:13&gt;
  1/1 tests failed
  1/1 tests failed
  
  ---------------|-----------|-----------|-----------|-----------|
  File           |   % Stmts |% Branches |   % Funcs |   % Lines |
  ---------------|-----------|-----------|-----------|-----------|
     tests\      |     33.33 |       100 |     66.67 |     33.33 |
        media.js |     33.33 |       100 |     66.67 |     33.33 |
  ---------------|-----------|-----------|-----------|-----------|
  All files      |     33.33 |       100 |     66.67 |     33.33 |
  ---------------|-----------|-----------|-----------|-----------|
  </code></pre>
  
  <p>My understanding is that the http module is a core module automatically installed with node.js, however I wonder if intern.js, although node-based, does not permit access to the core modules without additional configuration.  This seams reasonable, however I have looked at the intern.js tutorial and the intern.js configuration guide, but have not found a way to add a reference or dependency such that the test case is able to load the node.js http module successfully.   I am new to intern.js, so expect that I have not configured it or the test correctly.  </p>
  
  <p>I welcome any input/insight to what I am doing wrong.</p>
  
  <p>Best Regards,</p>
  
  <p>MW</p>