131 lines
4.2 KiB
JavaScript

import { module, test } from 'qunit';
import { setupRenderingTest } from 'ember-qunit';
import { render, triggerEvent } from '@ember/test-helpers';
import hbs from 'htmlbars-inline-precompile';
import sinon from 'sinon';
import { purgePolicyProps, exemptPolicy, PurgePolicy, getSupportedPurgePolicies } from 'wherehows-web/constants';
import { DatasetPlatform } from 'wherehows-web/constants/datasets/platform';
import platforms from 'wherehows-web/mirage/fixtures/list-platforms';
import { ApiStatus } from 'wherehows-web/utils/api';
module('Integration | Component | purge policy', function(hooks) {
setupRenderingTest(hooks);
hooks.beforeEach(function() {
this.sinonServer = sinon.createFakeServer();
});
hooks.afterEach(function() {
this.sinonServer.restore();
});
const policyList = '.purge-policy-list';
const policyTypes = Object.keys(purgePolicyProps);
const missingPolicyText = 'No policy';
test('it renders', async function(assert) {
assert.expect(1);
await render(hbs`{{purge-policy}}`);
assert.equal(document.querySelector(policyList).tagName, 'UL', 'expected component element is rendered');
});
test('it renders each purge policy in edit mode', async function(assert) {
assert.expect(1);
const purgePoliciesLength = policyTypes.length;
this.set('isEditable', true);
await render(hbs`{{purge-policy isEditable=isEditable}}`);
assert.equal(
document.querySelectorAll(`${policyList} [type=radio]`).length,
purgePoliciesLength,
'all policies are rendered'
);
});
test('it triggers the onPolicyChange action', async function(assert) {
assert.expect(2);
let onPolicyChangeActionCallCount = 0;
this.set('isEditable', true);
this.set('onPolicyChange', () => {
assert.equal(
++onPolicyChangeActionCallCount,
1,
'onPolicyChange action is invoked when change event is triggered'
);
});
await render(hbs`{{purge-policy onPolicyChange=onPolicyChange isEditable=isEditable}}`);
assert.equal(onPolicyChangeActionCallCount, 0, 'onPolicyChange action is not invoked on instantiation');
triggerEvent(`${policyList} [type=radio]`, 'change');
});
test('it renders a user message if the purge policy is not set and is in readonly mode', async function(assert) {
assert.expect(1);
this.set('missingPolicyText', missingPolicyText);
this.set('isEditable', false);
await render(hbs`{{purge-policy missingPolicyText=missingPolicyText isEditable=isEditable}}`);
assert.equal(
document.querySelector(`${policyList}`).textContent.trim(),
missingPolicyText,
`${missingPolicyText} is rendered`
);
});
test('it indicates the currently selected purge policy', async function(assert) {
assert.expect(1);
const selectedPolicy = PurgePolicy.ManualPurge;
const platform = DatasetPlatform.MySql;
this.set('isEditable', true);
this.set('platform', platform);
this.set('purgePolicy', selectedPolicy);
this.set('supportedPurgePolicies', getSupportedPurgePolicies(platform, platforms));
this.sinonServer.respondWith('GET', '/api/v1/list/platforms', [
200,
{ 'Content-Type': 'application/json' },
JSON.stringify({ status: ApiStatus.OK, platforms })
]);
await render(
hbs`{{purge-policy isEditable=isEditable purgePolicy=purgePolicy platform=platform supportedPurgePolicies=supportedPurgePolicies}}`
);
this.sinonServer.respond();
assert.ok(
document.querySelector(`${policyList} [type=radio][value=${selectedPolicy}]`).checked,
`${selectedPolicy} radio is checked`
);
});
test('it focuses the comment element for exempt policy', async function(assert) {
assert.expect(1);
const focusEditor = () => {
assert.equal(++focusMethodCount, 1, 'focusEditor action is invoked');
};
let selectedPolicy = exemptPolicy;
let platform = DatasetPlatform.MySql;
let focusMethodCount = 0;
this.setProperties({
platform,
focusEditor,
isEditable: true,
purgePolicy: selectedPolicy
});
await render(
hbs`{{purge-policy isEditable=isEditable purgePolicy=purgePolicy platform=platform focusEditor=focusEditor}}`
);
});
});