npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

vitest-environment-alpine

v0.0.2-alpha.2

Published

Vitest Environment for testing AlpineJS

Downloads

23

Readme

Vitest Environment: Alpine

An Environment to make testing the behavior of Alpine Components/Plugins/Tools, etc very simple! For Vitest!

Note: It is recommended that you do not directly install and manage this environment, but instead use testing-library-alpine to handle adding this environment, handling some additional setup, and providing useful helpers.

Installation

Just install with pnpm!

pnpm add vitest-environment-alpine

And add it as an environment to your vite.config.ts

export default defineConfig({
  test: {
    environment: 'alpine',
  },
});

If you just add alpine to the environment, vitest will ask you if you want to install it.

Alternatively, you can define per test file which environment to use with

// @vitest-environment alpine

at the top of a test file.

Usage

Inside test files, you'll have access to all the normal DOM/Browser APIs.

Note: DOM and Browser APIs are provided and implemented by Happy-DOM through the vitest builtin Happy-DOM environment. These are just tested against Alpine to ensure they will work.

it('has a document', () => {
  document.body.append(
    '<div>Hello World</div>'
  );

  expect(
    document.body
      .firstElementChild
      .textContent
  ).toBe('Hello World');
});

Naturally, Alpine is also already added and set up, accessible on the global scope!

it('has Alpine', () => {
  document.body.append(
    '<div x-data="{ foo: `bar` }" x-text="foo">Hello World</div>',
  );
  Alpine.start();
  expect(document.body.firstElementChild.textContent).toBe('bar');
});

Setup Teardown

Due to how Alpine renders on the document, its worthwhile to only call Alpine.start once, and instead use some other methods to handle resetting the state for each test. Or setup the test plugins/data/stores etc once in the parent suite.

To have manual test resetting, you can add the following

beforeEach(() => {
  Alpine.startObservingMutations();
});
afterEach(() => {
  Alpine.stopObservingMutations();
  Alpine.destroyTree(document.body);
  document.body.replaceChildren();
});
Alpine.start();

To your tests.

If you use testing-library-alpine this behavior is handled automatically and you can safely use the render helper without worry.

Spying on component methods

Automatically, methods on components are wrapped in vi.fn so that you can use spy on their usages.

it('has Alpine', () => {
  document.body.append(
    '<div x-data="{ foo() { return `bar` } }" x-text="foo()">Hello World</div>',
  );
  Alpine.start();
  expect(
    Alpine.$data(document.body.firstElementChild).foo,
  ).toHaveBeenCalledTimes(1);
});