112 lines
3.3 KiB
JavaScript
112 lines
3.3 KiB
JavaScript
|
import { find, click } from 'ember-native-dom-helpers';
|
||
|
import { test, moduleForComponent } from 'ember-qunit';
|
||
|
import wait from 'ember-test-helpers/wait';
|
||
|
import hbs from 'htmlbars-inline-precompile';
|
||
|
import sinon from 'sinon';
|
||
|
|
||
|
moduleForComponent('two-step-button', 'Integration | Component | two step button', {
|
||
|
integration: true,
|
||
|
});
|
||
|
|
||
|
const commonProperties = () => ({
|
||
|
idleText: 'Idle State Button',
|
||
|
cancelText: 'Cancel Action',
|
||
|
confirmText: 'Confirm Action',
|
||
|
confirmationMessage: 'Are you certain',
|
||
|
onConfirm: sinon.spy(),
|
||
|
onCancel: sinon.spy(),
|
||
|
});
|
||
|
|
||
|
const commonTemplate = hbs`
|
||
|
{{two-step-button
|
||
|
idleText=idleText
|
||
|
cancelText=cancelText
|
||
|
confirmText=confirmText
|
||
|
confirmationMessage=confirmationMessage
|
||
|
onConfirm=onConfirm
|
||
|
onCancel=onCancel}}
|
||
|
`;
|
||
|
|
||
|
test('presents as a button in the idle state', function(assert) {
|
||
|
const props = commonProperties();
|
||
|
this.setProperties(props);
|
||
|
this.render(commonTemplate);
|
||
|
|
||
|
assert.ok(find('[data-test-idle-button]'), 'Idle button is rendered');
|
||
|
assert.equal(
|
||
|
find('[data-test-idle-button]').textContent.trim(),
|
||
|
props.idleText,
|
||
|
'Button is labeled correctly'
|
||
|
);
|
||
|
|
||
|
assert.notOk(find('[data-test-cancel-button]'), 'No cancel button yet');
|
||
|
assert.notOk(find('[data-test-confirm-button]'), 'No confirm button yet');
|
||
|
assert.notOk(find('[data-test-confirmation-message]'), 'No confirmation message yet');
|
||
|
});
|
||
|
|
||
|
test('clicking the idle state button transitions into the promptForConfirmation state', function(assert) {
|
||
|
const props = commonProperties();
|
||
|
this.setProperties(props);
|
||
|
this.render(commonTemplate);
|
||
|
|
||
|
click('[data-test-idle-button]');
|
||
|
|
||
|
return wait().then(() => {
|
||
|
assert.ok(find('[data-test-cancel-button]'), 'Cancel button is rendered');
|
||
|
assert.equal(
|
||
|
find('[data-test-cancel-button]').textContent.trim(),
|
||
|
props.cancelText,
|
||
|
'Button is labeled correctly'
|
||
|
);
|
||
|
|
||
|
assert.ok(find('[data-test-confirm-button]'), 'Confirm button is rendered');
|
||
|
assert.equal(
|
||
|
find('[data-test-confirm-button]').textContent.trim(),
|
||
|
props.confirmText,
|
||
|
'Button is labeled correctly'
|
||
|
);
|
||
|
|
||
|
assert.equal(
|
||
|
find('[data-test-confirmation-message]').textContent.trim(),
|
||
|
props.confirmationMessage,
|
||
|
'Confirmation message is shown'
|
||
|
);
|
||
|
|
||
|
assert.notOk(find('[data-test-idle-button]'), 'No more idle button');
|
||
|
});
|
||
|
});
|
||
|
|
||
|
test('canceling in the promptForConfirmation state calls the onCancel hook and resets to the idle state', function(assert) {
|
||
|
const props = commonProperties();
|
||
|
this.setProperties(props);
|
||
|
this.render(commonTemplate);
|
||
|
|
||
|
click('[data-test-idle-button]');
|
||
|
|
||
|
return wait().then(() => {
|
||
|
click('[data-test-cancel-button]');
|
||
|
|
||
|
return wait().then(() => {
|
||
|
assert.ok(props.onCancel.calledOnce, 'The onCancel hook fired');
|
||
|
assert.ok(find('[data-test-idle-button]'), 'Idle button is back');
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
|
||
|
test('confirming the promptForConfirmation state calls the onConfirm hook and resets to the idle state', function(assert) {
|
||
|
const props = commonProperties();
|
||
|
this.setProperties(props);
|
||
|
this.render(commonTemplate);
|
||
|
|
||
|
click('[data-test-idle-button]');
|
||
|
|
||
|
return wait().then(() => {
|
||
|
click('[data-test-confirm-button]');
|
||
|
|
||
|
return wait().then(() => {
|
||
|
assert.ok(props.onConfirm.calledOnce, 'The onConfirm hook fired');
|
||
|
assert.ok(find('[data-test-idle-button]'), 'Idle button is back');
|
||
|
});
|
||
|
});
|
||
|
});
|