import { module, test } from 'qunit'; import { setupRenderingTest } from 'ember-qunit'; import { render, settled, waitFor } from '@ember/test-helpers'; import hbs from 'htmlbars-inline-precompile'; import { Milestone, PostableCollection, WorkflowMessage, WorkflowPostable, WorkflowCard, } from '@cardstack/web-client/models/workflow'; import { WorkflowStub } from '@cardstack/web-client/tests/stubs/workflow'; module('Integration | Component | workflow-thread', function (hooks) { setupRenderingTest(hooks); test('it renders before-content named block', async function (assert) { this.set('workflow', new WorkflowStub(this.owner)); await render(hbs` <:before-content>
Hello world
`); assert.dom('[data-test-hello-world]').exists(); assert.dom('[data-test-workflow-thread]').isFocused(); }); test('it renders date divider before first post and when the date changes', async function (assert) { let workflow = new WorkflowStub(this.owner); let postable1 = new WorkflowMessage({ author: { name: 'cardbot' }, message: 'Hello world', }); let postable2 = new WorkflowMessage({ author: { name: 'cardbot' }, message: 'How are you today?', }); let postable3 = new WorkflowMessage({ author: { name: 'joe' }, message: 'Fine thank you.', }); let postable4 = new WorkflowMessage({ author: { name: 'steve' }, message: 'One more thing...', }); workflow.milestones = [ new Milestone({ title: 'First milestone', postables: [postable1], completedDetail: 'You are number one!', }), new Milestone({ title: 'Second milestone', postables: [postable2, postable3], completedDetail: 'Had to do number two!', }), ]; workflow.epilogue.postables = [postable4]; // new Date(year, monthIndex, day, hour, minute, second) postable1.timestamp = new Date(2021, 4, 20, 0, 0, 0); postable2.timestamp = new Date(2021, 4, 20, 0, 0, 0); postable3.timestamp = new Date(2021, 4, 21, 0, 0, 0); postable4.timestamp = new Date(2021, 4, 21, 0, 0, 0); this.set('workflow', workflow); workflow.attachWorkflow(); await render(hbs` `); assert.dom('[data-test-date-divider]').exists({ count: 2 }); assert.dom('[data-test-workflow-thread]').isFocused(); }); test('it uses the appropriate text for milestone statuses', async function (assert) { let workflow = new WorkflowStub(this.owner); workflow.milestones = [ new Milestone({ title: 'First milestone', postables: [ new WorkflowMessage({ author: { name: 'cardbot' }, message: 'Hello world', }), ], completedDetail: 'You are number one!', }), new Milestone({ title: 'Second milestone', postables: [ new WorkflowMessage({ author: { name: 'cardbot' }, message: 'Hello world', }), ], completedDetail: 'Had to do number two!', }), new Milestone({ title: 'Third milestone', postables: [ new WorkflowMessage({ author: { name: 'cardbot' }, message: 'Hello world', }), ], completedDetail: 'Finished', }), ]; this.set('workflow', workflow); workflow.attachWorkflow(); await render(hbs` `); assert .dom('[data-test-milestone-completed][data-test-milestone="0"]') .containsText('Milestone reached'); assert .dom('[data-test-milestone-completed][data-test-milestone="1"]') .containsText('Milestone reached'); assert .dom('[data-test-milestone-completed][data-test-milestone="2"]') .containsText( 'Workflow completed', "Final milestone should have text 'Workflow completed'" ); }); test('it renders epilogue posts after the workflow is complete', async function (assert) { let workflow = new WorkflowStub(this.owner); let postable1 = new WorkflowPostable({ name: 'cardbot' }); workflow.milestones = [ new Milestone({ title: 'First milestone', postables: [postable1], completedDetail: 'You are number one!', }), ]; workflow.epilogue = new PostableCollection([ new WorkflowMessage({ author: { name: 'cardbot' }, message: 'This is the epilogue', }), ]); this.set('workflow', workflow); workflow.attachWorkflow(); await render(hbs` `); assert.dom('[data-test-epilogue][data-test-postable]').doesNotExist(); postable1.isComplete = true; await waitFor('[data-test-epilogue][data-test-postable]'); assert .dom('[data-test-epilogue][data-test-postable]') .hasTextContaining('This is the epilogue'); }); test('it renders cancelation posts after the workflow is canceled', async function (assert) { let workflow = new WorkflowStub(this.owner); workflow.milestones = [ new Milestone({ title: 'First milestone', postables: [ new WorkflowPostable({ name: 'cardbot' }), new WorkflowPostable({ name: 'cardbot' }), ], completedDetail: 'You are number one!', }), ]; workflow.cancelationMessages = new PostableCollection([ new WorkflowMessage({ author: { name: 'cardbot' }, message: 'You canceled the workflow!', }), ]); this.set('workflow', workflow); workflow.attachWorkflow(); await render(hbs` `); assert.dom('[data-test-postable]').exists({ count: 1 }); assert.dom('[data-test-cancelation][data-test-postable]').doesNotExist(); workflow.cancel('TEST'); await waitFor('[data-test-cancelation][data-test-postable]'); assert.dom('[data-test-postable]').exists({ count: 2 }); assert .dom('[data-test-cancelation][data-test-postable]') .hasTextContaining('You canceled the workflow!'); }); test('A workflow can be rolled back', async function (assert) { this.owner.register( 'template:components/dummy-test', hbs`
Just a dummy component so we don't have to depend on existing components for this test
` ); let workflow = new WorkflowStub(this.owner); let message = () => new WorkflowMessage({ author: { name: 'cardbot' }, message: 'A message', }); let target = new WorkflowCard({ author: { name: 'cardbot' }, componentName: 'dummy-test', }); target.isComplete = true; workflow.milestones = [ new Milestone({ title: 'First milestone', postables: [message(), target], completedDetail: 'You are number one!', }), new Milestone({ title: 'Second milestone', postables: [message(), message()], completedDetail: 'You are number two!', }), ]; workflow.epilogue = new PostableCollection([ new WorkflowMessage({ author: { name: 'cardbot' }, message: 'This is the epilogue', }), ]); this.set('workflow', workflow); workflow.attachWorkflow(); await render(hbs` `); assert.dom('[data-test-milestone="0"]').isVisible(); assert.dom('[data-test-milestone="1"]').isVisible(); target.onIncomplete(); await settled(); assert.dom('[data-test-milestone="1"]').doesNotExist(); assert .dom('[data-test-milestone="0"][data-test-milestone-completed]') .doesNotExist(); }); });