Constructor
new Harness(optionsopt)
Parameters:
Name | Type | Attributes | Description | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
options |
Object |
<optional> |
Specify the behavior of the Harness
Properties
|
- Source:
Example
const Harness = require('cht-conf-test-harness');
const instance = new Harness({
verbose: true,
directory: '/home/me/config-me/',
});
await instance.start();
await instance.setNow('2000-01-01');
await instance.loadForm('my_xform');
const result = await instance.fillForm(['first page, first answer', 'first page, second answer'], ['second page, first answer']);
expect(result.errors).to.be.empty;
expect(result.report).to.deep.include({
fields: {
patient_name: 'Patient Name',
next_pnc: {
s_next_pnc: 'no',
next_pnc_date: '',
},
}
});
Members
consoleErrors
A filtered set of errors inside of state.console. Useful for easy assertions.
- Source:
Example
expect(harness.consoleErrors).to.be.empty;
content
`content` from the HarnessInputs set through the constructor (defaulting to values from harness.defaults.json file)
- Source:
coreVersion
`coreVersion` is the version of the cht-core that is being emulated in testing (eg. 3.9.0)
- Source:
state
Details the current HarnessState of the Harness
- Source:
user
`user` from the HarnessInputs set through the constructor (defaulting to values from harness.defaults.json file)
- Source:
userRoles
`userRoles` from the HarnessInputs set through the constructor (defaulting to values from harness.defaults.json file)
- Source:
userSettingsDoc
`userSettingsDoc` from the HarnessInputs set through the constructor
- Default Value:
- {Object} A constructed object of type `user-settings` https://docs.communityhealthtoolkit.org/core/overview/db-schema/#users based on known user information
- Source:
Methods
(async) clear() → {Promise}
Resets the HarnessState
- Source:
Returns:
Resolves when the state of the harness when cleared
- Type
- Promise
(async) countTaskDocsByState(optionsopt)
Counts the number of task documents grouped by state. Explanation of task documents and states
Parameters:
Name | Type | Attributes | Description | ||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
options |
Object |
<optional> |
Some options when summarizing the tasks
Properties
|
- Source:
Returns:
Map with keys equal to task document state and values equal to the number of task documents in that state.
Example
const summary = await countTaskDocsByState({ title: 'my-task-title' });
expect(summary).to.nested.include({
Complete: 1, // 1 task events were marked as resolved
Failed: 2, // 2 task events were not marked as resolved prior to expiring
Draft: 3, // 3 task events are in the future
});
(async) fillContactCreateForm(contactType, …answers)
Loads and fills a contact form
Parameters:
Name | Type | Attributes | Description |
---|---|---|---|
contactType |
string | Type of contact that should be created | |
answers |
Array.<string> |
<repeatable> |
Provide an array for the answers given on each page. See fillForm for more details. |
- Source:
(async) fillContactEditForm(contactType, …answers)
Loads and fills a contact edit form
Parameters:
Name | Type | Attributes | Description |
---|---|---|---|
contactType |
string | Type of contact that should be created | |
answers |
Array.<string> |
<repeatable> |
Provide an array for the answers given on each page. See fillForm for more details. |
- Source:
(async) fillContactForm(contactType, …answers)
Parameters:
Name | Type | Attributes | Description |
---|---|---|---|
contactType |
string | Type of contact that should be created | |
answers |
Array.<string> |
<repeatable> |
Provide an array for the answers given on each page. See fillForm for more details. |
- Deprecated:
- since version 2.4.1, use fillContactCreateForm instead Loads and fills a contact form,
- Source:
(async) fillForm(load, …answers) → {FillResult}
Fills in a form given some answers
Parameters:
Name | Type | Attributes | Description |
---|---|---|---|
load |
Object | string | An optional shorthand for loading a form before filling it. If a string is provided, this will be passed to loadForm as the formName. If an Object is provided, it can have attributes { form, user, content, contactSummary } | |
answers |
Array.<string> |
<repeatable> |
Provide an array for the answers given on each page |
- Source:
Returns:
The result of filling the form
- Type
- FillResult
Example
// Load a form and then fill it in
await harness.loadForm('my_form');
const result = await harness.fillForm(['first page first answer', 'first page second answer'], ['second page first answer']);
// Load and fill a form in one statement
const result = await harness.fillForm('my_form', ['1', '2'], ['3']});
(async) flush(amount)
Increment the current time by an amount
Parameters:
Name | Type | Description |
---|---|---|
amount |
Object | Duration | number | An object with attributes { years, quarters, months, weeks, days, hours, minutes, seconds, milliseconds } describing how far to move forward in time, a Duration object or a number describing how many days to move forward in time. |
- Source:
Example
await flush({ years: 1, minutes: 5 }); // move one year and 5 minutes forward in time
await flush(1); // move one day forward in time
(async) getContactSummary(contactopt, reportsopt, lineageopt) → {ContactSummary}
Obtains the result of the running the contact-summary.js or the compiled contact-summary.templated.js scripts from the project folder
Parameters:
Name | Type | Attributes | Description |
---|---|---|---|
contact |
string |
<optional> |
The contact doc that will be passed into the contactSummary script. Given a {string}, a contact will be loaded and hydrated from HarnessState. If left empty, the subject will be used. |
reports |
Array.<Object> |
<optional> |
An array of reports associated with contact. If left empty, the contact's reports will be loaded from HarnessState. |
lineage |
Array.<Object> |
<optional> |
An array of the contact's hydrated ancestors. If left empty, the contact's ancestors will be used from HarnessState. |
- Source:
Returns:
The result of the contact summary under test.
- Type
- ContactSummary
getNow() → {number}
Get the current mock-time. If no time has been set, defaults to the current system time.
- Source:
Returns:
The current mock-time as epoch time (set via `setNow` or `flush`). If time has not been mocked, defaults to the current system clock.
- Type
- number
(async) getTargets(optionsopt) → {Array.<Target>}
Check the state of targets
Parameters:
Name | Type | Attributes | Description | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
options |
Object |
<optional> |
Some options for looking for checking for targets
Properties
|
- Source:
Returns:
An array of targets which would be visible to the user
- Type
- Array.<Target>
(async) getTasks(optionsopt) → {Array.<Task>}
Check which tasks are visible
Parameters:
Name | Type | Attributes | Description | ||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
options |
Object |
<optional> |
Some options when checking for tasks
Properties
|
- Source:
Returns:
An array of task documents which would be visible to the user given the current HarnessState
- Type
- Array.<Task>
(async) loadAction(taskDoc)
Simulates the user clicking on an action
Parameters:
Name | Type | Description |
---|---|---|
taskDoc |
Object | A Task or, if that task has multiple actions then one of the direct actions |
- Source:
Example
// Complete a form on January 1
await harness.setNow('2000-01-01')
const initialResult = await harness.fillForm('pnc_followup', ['no'], ['yes', '2000-01-07']);
expect(initialResult.errors).to.be.empty;
// Verify a task appears on January 7
await harness.setNow('2000-01-07');
const tasks = await harness.getTasks();
expect(tasks).to.have.property('length', 1);
// Complete the task's action
await harness.loadAction(tasks[0]);
const followupResult = await harness.fillForm(['no_come_back']);
expect(followupResult.errors).to.be.empty;
// Verify the task got resolved
const actual = await harness.getTasks();
expect(actual).to.be.empty;
(async) loadForm(formName) → {HarnessState}
Load a form from the app folder into the harness for testing
Parameters:
Name | Type | Attributes | Default | Description |
---|---|---|---|---|
formName |
string | Filename of an Xml file describing an XForm to load for testing | ||
options.user |
string |
<optional> |
You can override some or all of the HarnessInputs attributes. | |
options.subject |
string |
<optional> |
harness configuration file | You can override some or all of the HarnessInputs attributes. |
options.content |
Object |
<optional> |
harness configuration file | You can override some or all of the HarnessInputs attributes. |
options.contactSummary |
Object |
<optional> |
harness configuration file | You can override some or all of the HarnessInputs attributes. |
- Deprecated:
- Use fillForm interface (#40)
- Source:
Returns:
The current state of the form
- Type
- HarnessState
pushMockedDoc(…docs)
Push a mocked document directly into the state
Parameters:
Name | Type | Attributes | Description |
---|---|---|---|
docs |
Object |
<repeatable> |
The document to push |
- Source:
setNow(now)
Set the current mock-time of the harness. Mocks global time uses sinon
Parameters:
Name | Type | Description |
---|---|---|
now |
Date | DateTime | number | string | A Date object, DateTime object or a value which can be parsed into a Date |
- Source:
(async) start() → {Promise.Browser}
Starts a virtual browser. Typically put this in your test's before hook or alike.
- Source:
Returns:
Resolves a Puppeteer Browser when the harness is ready.
- Type
- Promise.Browser
Example
before(async () => { return await harness.start(); });
(async) stop() → {Promise}
Stops and cleans up the virtual browser.
- Source:
Returns:
Resolves when the harness is fully cleaned up.
- Type
- Promise
Example
after(async () => { return await harness.stop(); });