uuid: - value: 79fdad19-834d-463e-89f6-059c0865a034 langcode: - value: en type: - target_id: daily_email target_type: node_type target_uuid: 8bde1f2f-eef9-4f2d-ae9c-96921f8193d7 revision_timestamp: - value: '2025-05-11T09:00:48+00:00' revision_uid: - target_type: user target_uuid: b8966985-d4b2-42a7-a319-2e94ccfbb849 revision_log: { } status: - value: true uid: - target_type: user target_uuid: b8966985-d4b2-42a7-a319-2e94ccfbb849 title: - value: | Testable Tailwind CSS plugins created: - value: '2023-01-04T00:00:00+00:00' changed: - value: '2025-05-11T09:00:48+00:00' promote: - value: false sticky: - value: false default_langcode: - value: true revision_translation_affected: - value: true path: - alias: /daily/2023/01/04/testable-tailwind-css-plugins langcode: en body: - value: |

A great thing about Tailwind CSS plugins being written in JavaScript is that they can be tested using tools like Jest.

Here's an example from https://github.com/opdavies/tailwindcss-plugin-jest-example (it may need updating to work with the latest Tailwind versions or to use the latest best practices):

function run(options = {}) {
        return postcss(
          tailwindcss({
            corePlugins: false,
            plugins: [plugin(options)]
          })
        )
        .process('@tailwind utilities;', {
          from: undefined
        })
      }

      expect.extend({
        toMatchCss: cssMatcher
      })

      test('it generates the correct classes with no variants', () => {
        const output = `
          .test {
            display: block
          }
        `

        run().then(result => {
          expect(result.css).toMatchCss(output)
        })
      })

      test('it generates the correct classes with variants', () => {
        const output = `
          .test {
            display: block
          }
          .hover\\:test:hover {
            display: block
          }
          .focus\\:test:focus {
            display: block
          }
        `

        run({ variants: ['hover', 'focus'] }).then(result => {
          expect(result.css).toMatchCss(output)
        })
      });
      

Within the test, Tailwind can be run using PostCSS and generates styles based on a provided configuration, which is then checked against some expected output. If the generated styles match what was expected, the tests pass and the plugin is working as expected.

format: full_html processed: |

A great thing about Tailwind CSS plugins being written in JavaScript is that they can be tested using tools like Jest.

Here's an example from https://github.com/opdavies/tailwindcss-plugin-jest-example (it may need updating to work with the latest Tailwind versions or to use the latest best practices):

function run(options = {}) {
        return postcss(
          tailwindcss({
            corePlugins: false,
            plugins: [plugin(options)]
          })
        )
        .process('@tailwind utilities;', {
          from: undefined
        })
      }

      expect.extend({
        toMatchCss: cssMatcher
      })

      test('it generates the correct classes with no variants', () => {
        const output = `
          .test {
            display: block
          }
        `

        run().then(result => {
          expect(result.css).toMatchCss(output)
        })
      })

      test('it generates the correct classes with variants', () => {
        const output = `
          .test {
            display: block
          }
          .hover\\:test:hover {
            display: block
          }
          .focus\\:test:focus {
            display: block
          }
        `

        run({ variants: ['hover', 'focus'] }).then(result => {
          expect(result.css).toMatchCss(output)
        })
      });
      

Within the test, Tailwind can be run using PostCSS and generates styles based on a provided configuration, which is then checked against some expected output. If the generated styles match what was expected, the tests pass and the plugin is working as expected.

summary: null field_daily_email_cta: { }