Skip to content

Testing

Components that use contexts can be tested with minimal, if none, adaptations when compared with standard ones.

TLDR

Check Vitest and Web Test Runner test suites at testing example folder. The library itself is tested with Jest.

The examples use @open-wc/testing that provides time saving utilities

Context consumed with class mixins

Testing a component with a context consumed using the class mixins (both Lit or generic) is no different of testing a simple property.

Component to be tested definition

js
import { LitElement } from 'lit'
import { withContext } from 'wc-context/lit.js'

class MyEl extends withContext(LitElement) {
  static properties = {
    foo: { type: String, context: 'fooContext' },
  }
}

customElements.define('my-el', MyEl)
import { LitElement } from 'lit'
import { withContext } from 'wc-context/lit.js'

class MyEl extends withContext(LitElement) {
  static properties = {
    foo: { type: String, context: 'fooContext' },
  }
}

customElements.define('my-el', MyEl)

Test code

js
import { html, fixture } from '@open-wc/testing'

it('test foo property that consumes a context', async () => {
  const el = await fixture(html` <my-el .foo=${'bar'}></my-el> `)
  expect(el.foo).to.equal('bar')
})
import { html, fixture } from '@open-wc/testing'

it('test foo property that consumes a context', async () => {
  const el = await fixture(html` <my-el .foo=${'bar'}></my-el> `)
  expect(el.foo).to.equal('bar')
})

Context consumed with controller/dedicated elements

Testing a component whose context value is not reflected in a property, e.g., when using ContextConsumer controller, requires that the context be provided explicitly.

Component to be tested definition

js
import { LitElement } from 'lit'
import { ContextConsumer } from 'wc-context/controllers.js'

class MyEl extends LitElement {
  fooContextConsumer = new ContextConsumer(this, 'fooContext')

  render() {
    return html`<div>fooContext: ${this.fooContextConsumer.value}</div>`
  }
}

customElements.define('my-el', MyEl)
import { LitElement } from 'lit'
import { ContextConsumer } from 'wc-context/controllers.js'

class MyEl extends LitElement {
  fooContextConsumer = new ContextConsumer(this, 'fooContext')

  render() {
    return html`<div>fooContext: ${this.fooContextConsumer.value}</div>`
  }
}

customElements.define('my-el', MyEl)

Provide context with lit provider directive

js
import { html, fixture } from '@open-wc/testing'
import { contextProvider } from 'wc-context/lit.js'

it('test foo property that consumes a context', async () => {
  const el = await fixture(
    html`<my-el ${contextProvider('fooContext', 'bar')}></my-el> `
  )
  expect(el).shadowDom.to.equal('<div>fooContext: bar</div>')
})
import { html, fixture } from '@open-wc/testing'
import { contextProvider } from 'wc-context/lit.js'

it('test foo property that consumes a context', async () => {
  const el = await fixture(
    html`<my-el ${contextProvider('fooContext', 'bar')}></my-el> `
  )
  expect(el).shadowDom.to.equal('<div>fooContext: bar</div>')
})

Provide context using registerContext in a parent node

js
import { expect, fixture, html } from '@open-wc/testing'
import { registerContext } from 'wc-context'

function createContextNode(contexts) {
  const el = document.createElement('div')
  for (const [context, value] of Object.entries(contexts)) {
    registerContext(el, context, value)
  }
  return el
}

it('test foo property that consumes a context', async () => {
  const el = await fixture(html`<my-el></my-el>`, {
    parentNode: createContextNode({ fooContext: 'bar' }),
  })
  expect(el).shadowDom.to.equal('<div>fooContext: bar</div>')
})
import { expect, fixture, html } from '@open-wc/testing'
import { registerContext } from 'wc-context'

function createContextNode(contexts) {
  const el = document.createElement('div')
  for (const [context, value] of Object.entries(contexts)) {
    registerContext(el, context, value)
  }
  return el
}

it('test foo property that consumes a context', async () => {
  const el = await fixture(html`<my-el></my-el>`, {
    parentNode: createContextNode({ fooContext: 'bar' }),
  })
  expect(el).shadowDom.to.equal('<div>fooContext: bar</div>')
})

Released under the MIT License.