Files
freeCodeCamp/curriculum/challenges/english/06-quality-assurance/quality-assurance-and-testing-with-chai/run-functional-tests-on-api-endpoints-using-chai-http.md
Kristofer Koishigawa 361fba686e fix: update mocha chai challenge text, code snippets (#43065)
* fix: update mocha chai challenge text, code snippets

* fix: add expected output values to instructions

* fix: reword instructions a little bit

* fix: adjust challenge test for new test suite in boilerpplate

Co-authored-by: moT01 <20648924+moT01@users.noreply.github.com>
2021-08-10 09:45:12 -07:00

3.2 KiB

id, title, challengeType, forumTopicId, dashedName
id title challengeType forumTopicId dashedName
587d824e367417b2b2512c58 Run Functional Tests on API Endpoints using Chai-HTTP 2 301593 run-functional-tests-on-api-endpoints-using-chai-http

--description--

As a reminder, this project is being built upon the following starter project on Replit, or cloned from GitHub.

Mocha allows you to test asynchronous operations like calls to API endpoints with a plugin called chai-http.

The following is an example of a test using chai-http for a suite called 'GET /hello?name=[name] => "hello [name]"':

suite('GET /hello?name=[name] => "hello [name]"', function () {
  test('?name=John', function (done) {
    chai
      .request(server)
      .get('/hello?name=John')
      .end(function (err, res) {
        assert.equal(res.status, 200, 'Response status should be 200');
        assert.equal(res.text, 'hello John', 'Response should be "hello John"');
        done();
      });
  });
});

The test sends a GET request to the server with a name as a URL query string (?name=John). In the end method's callback function, the response object (res) is received and contains the status property.

The first assert.equal checks if the status is equal to 200. The second assert.equal checks that the response string (res.text) is equal to "hello John".

Also, notice the done parameter in the test's callback function. Calling it without an argument at the end of a test is necessary to signal that the asynchronous operation is complete.

--instructions--

Within tests/2_functional-tests.js, alter the 'Test GET /hello with no name' test (// #1) to assert the status and the text of the response to make the test pass. Do not alter the arguments passed to the asserts.

There should be no URL query. Without a name URL query, the endpoint responds with hello Guest.

--hints--

All tests should pass

(getUserInput) =>
  $.get(getUserInput('url') + '/_api/get-tests?type=functional&n=0').then(
    (data) => {
      assert.equal(data.state, 'passed');
    },
    (xhr) => {
      throw new Error(xhr.responseText);
    }
  );

You should test for res.status == 200

(getUserInput) =>
  $.get(getUserInput('url') + '/_api/get-tests?type=functional&n=0').then(
    (data) => {
      assert.equal(data.assertions[0].method, 'equal');
      assert.equal(data.assertions[0].args[0], 'res.status');
      assert.equal(data.assertions[0].args[1], '200');
    },
    (xhr) => {
      throw new Error(xhr.responseText);
    }
  );

You should test for res.text == 'hello Guest'

(getUserInput) =>
  $.get(getUserInput('url') + '/_api/get-tests?type=functional&n=0').then(
    (data) => {
      assert.equal(data.assertions[1].method, 'equal');
      assert.equal(data.assertions[1].args[0], 'res.text');
      assert.match(data.assertions[1].args[1], /('|")hello Guest\1/);
    },
    (xhr) => {
      throw new Error(xhr.responseText);
    }
  );

--solutions--

/**
  Backend challenges don't need solutions, 
  because they would need to be tested against a full working project. 
  Please check our contributing guidelines to learn more.
*/