import { ExampleWorkspaceContextCounterContext, EXAMPLE_COUNTER_CONTEXT } from './counter-workspace-context.js'; import { ExampleCounterWorkspaceViewElement } from './counter-workspace-view.js'; import { ExampleCounterStatusFooterAppElement } from './counter-status-footer-app.element.js'; import { expect, fixture, defineCE } from '@open-wc/testing'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { html } from '@umbraco-cms/backoffice/external/lit'; class TestHostElement extends UmbLitElement {} const testHostElement = defineCE(TestHostElement); describe('WorkspaceContextCounterElement', () => { let element: UmbLitElement; let context: ExampleWorkspaceContextCounterContext; beforeEach(async () => { element = await fixture(`<${testHostElement}>`); context = new ExampleWorkspaceContextCounterContext(element); }); describe('Counter functionality', () => { it('initializes with counter value of 0', (done) => { context.counter.subscribe((value) => { expect(value).to.equal(0); done(); }); }); it('increments counter value when increment method is called', (done) => { let callbackCount = 0; context.counter.subscribe((value) => { callbackCount++; if (callbackCount === 1) { expect(value).to.equal(0); context.increment(); } else if (callbackCount === 2) { expect(value).to.equal(1); done(); } }); }); it('increments counter multiple times correctly', (done) => { let callbackCount = 0; context.counter.subscribe((value) => { callbackCount++; if (callbackCount === 1) { expect(value).to.equal(0); context.increment(); context.increment(); context.increment(); } else if (callbackCount === 4) { expect(value).to.equal(3); done(); } }); }); }); describe('Reset functionality', () => { it('resets counter to 0 when reset method is called', (done) => { let callbackCount = 0; context.counter.subscribe((value) => { callbackCount++; if (callbackCount === 1) { expect(value).to.equal(0); // First increment the counter context.increment(); context.increment(); } else if (callbackCount === 3) { expect(value).to.equal(2); // Then reset it context.reset(); } else if (callbackCount === 4) { expect(value).to.equal(0); done(); } }); }); it('can reset from any counter value', (done) => { let callbackCount = 0; context.counter.subscribe((value) => { callbackCount++; if (callbackCount === 1) { expect(value).to.equal(0); // Increment to a higher number context.increment(); context.increment(); context.increment(); context.increment(); context.increment(); } else if (callbackCount === 6) { expect(value).to.equal(5); context.reset(); } else if (callbackCount === 7) { expect(value).to.equal(0); done(); } }); }); it('reset works when counter is already at 0', (done) => { context.counter.subscribe((value) => { expect(value).to.equal(0); // Reset when already at 0 - should not cause issues context.reset(); // Verify it's still 0 expect(value).to.equal(0); done(); }); }); }); describe('Increment and Reset interaction', () => { it('can increment after reset', (done) => { let callbackCount = 0; context.counter.subscribe((value) => { callbackCount++; if (callbackCount === 1) { expect(value).to.equal(0); context.increment(); } else if (callbackCount === 2) { expect(value).to.equal(1); context.reset(); } else if (callbackCount === 3) { expect(value).to.equal(0); context.increment(); } else if (callbackCount === 4) { expect(value).to.equal(1); done(); } }); }); }); describe('Context integration', () => { it('provides context that can be consumed by other components', () => { // Verify context is available for consumption expect(EXAMPLE_COUNTER_CONTEXT).to.not.be.undefined; }); }); }); describe('ExampleCounterWorkspaceView', () => { let element: ExampleCounterWorkspaceViewElement; let context: ExampleWorkspaceContextCounterContext; let hostElement: UmbLitElement; beforeEach(async () => { hostElement = await fixture(`<${testHostElement}>`); context = new ExampleWorkspaceContextCounterContext(hostElement); element = await fixture(html``, { parentNode: hostElement, }); // Wait for context consumption await element.updateComplete; }); describe('Counter value display', () => { it('shows initial counter value', async () => { await element.updateComplete; const displayText = element.shadowRoot?.textContent; expect(displayText).to.include('Current count value: 0'); }); it('reflects counter value changes when incremented', async () => { context.increment(); await element.updateComplete; const displayText = element.shadowRoot?.textContent; expect(displayText).to.include('Current count value: 1'); }); it('reflects counter value changes when incremented multiple times', async () => { context.increment(); context.increment(); context.increment(); await element.updateComplete; const displayText = element.shadowRoot?.textContent; expect(displayText).to.include('Current count value: 3'); }); it('reflects counter value changes when reset', async () => { context.increment(); context.increment(); await element.updateComplete; let displayText = element.shadowRoot?.textContent; expect(displayText).to.include('Current count value: 2'); context.reset(); await element.updateComplete; displayText = element.shadowRoot?.textContent; expect(displayText).to.include('Current count value: 0'); }); it('maintains correct value display through increment and reset cycles', async () => { // Test a complete workflow cycle context.increment(); context.increment(); context.increment(); await element.updateComplete; expect(element.shadowRoot?.textContent).to.include('Current count value: 3'); context.reset(); await element.updateComplete; expect(element.shadowRoot?.textContent).to.include('Current count value: 0'); context.increment(); await element.updateComplete; expect(element.shadowRoot?.textContent).to.include('Current count value: 1'); }); }); }); describe('ExampleCounterStatusFooterAppElement', () => { let element: ExampleCounterStatusFooterAppElement; let context: ExampleWorkspaceContextCounterContext; let hostElement: UmbLitElement; beforeEach(async () => { hostElement = await fixture(`<${testHostElement}>`); context = new ExampleWorkspaceContextCounterContext(hostElement); element = await fixture(html``, { parentNode: hostElement, }); // Wait for context consumption await element.updateComplete; }); describe('Status display', () => { it('shows initial counter status', async () => { await element.updateComplete; const displayText = element.shadowRoot?.textContent; expect(displayText).to.include('Counter: 0'); }); it('reflects counter state changes when incremented', async () => { context.increment(); await element.updateComplete; const displayText = element.shadowRoot?.textContent; expect(displayText).to.include('Counter: 1'); }); it('reflects counter state changes when incremented multiple times', async () => { context.increment(); context.increment(); context.increment(); context.increment(); context.increment(); await element.updateComplete; const displayText = element.shadowRoot?.textContent; expect(displayText).to.include('Counter: 5'); }); it('reflects counter state changes when reset', async () => { context.increment(); context.increment(); context.increment(); await element.updateComplete; let displayText = element.shadowRoot?.textContent; expect(displayText).to.include('Counter: 3'); context.reset(); await element.updateComplete; displayText = element.shadowRoot?.textContent; expect(displayText).to.include('Counter: 0'); }); it('maintains accurate status display through complete workflow cycles', async () => { // Test comprehensive state change tracking await element.updateComplete; expect(element.shadowRoot?.textContent).to.include('Counter: 0'); context.increment(); context.increment(); await element.updateComplete; expect(element.shadowRoot?.textContent).to.include('Counter: 2'); context.reset(); await element.updateComplete; expect(element.shadowRoot?.textContent).to.include('Counter: 0'); context.increment(); await element.updateComplete; expect(element.shadowRoot?.textContent).to.include('Counter: 1'); }); it('synchronizes with context state changes across multiple increments and resets', async () => { // Test synchronization with rapid state changes context.increment(); context.increment(); context.increment(); context.reset(); context.increment(); context.increment(); await element.updateComplete; const displayText = element.shadowRoot?.textContent; expect(displayText).to.include('Counter: 2'); }); }); });