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

temp-context

v2.2.0

Published

Test Context To Initialise Temporary Directory For Each Test, And Remove It At The End. It Contains Methods To Read, Write, Clone, Assert Existence And Remove Files Inside And Outside Of Temp Dir.

Downloads

151

Readme

temp-context

npm version

temp-context is a Zoroaster test context to initialise a temporary directory for each test, and remove it at the end. It also contains methods to read, write, clone, assert existence and remove files inside and outside of the temp dir.

yarn add -E temp-context

Table Of Contents

API

The package is available by importing its default function:

import TempContext from 'temp-context'

class TempContext

Instances of this test context class will create a temp directory in the test folder on initialisation, and remove it at the end of each test. To change the location of the test directory, extend the class.

The test context is used with the Zoroaster testing framework, which will initialise and destroy it for every test. Check the example section to see how tests are implemented.

TempContext: A test context that creates and destroys a temp directory. By default, the temp directory will be test/temp relative to the current working directory, but it can be changed by extending the class and setting its TEMP property in the constructor.

For snapshots, the following options can be specified:

SnapshotOptions

Example

Zoroaster tests can be written either as masks, or more traditionally as specs. For example, a program might want to write given data to a file in a specified directory, as so:

import { join } from 'path'
import { createWriteStream } from 'fs'

/**
 * Writes given data to a hidden file.
 * @param {string} path Path to the directory where to create a file.
 * @param {string} data Data to write.
 */
const program = async (path, data) => {
  const j = join(path, '.test')
  const rs = createWriteStream(j)
  await new Promise((r) => {
    rs.end(`hello world: ${data}`)
    rs.on('close', r)
  })
}

export default program

When writing tests with Zoroaster, the project directory will have the src and test directories:

example
├── src
│   └── index.js
└── test
    ├── context
    │   ├── index.js
    │   └── temp.js
    ├── mask
    │   └── default.js
    ├── result
    │   └── default.md
    └── spec
        ├── default.js
        └── extended.js

Masks

To implement tests with masks, a mask implementation should be set up in the mask directory:

import makeTestSuite from '@zoroaster/mask'
import TempContext from 'temp-context'
import program from '../../src'

/**
 * This test suite will clone an input and take a snapshot of the temp directory.
 */
export default makeTestSuite('example/test/result', {
  /**
   * @param {TempContext} context
   */
  async getResults({ TEMP, snapshot }) {
    await program(TEMP, this.input)
    const s = await snapshot()
    return s
  },
  context: TempContext,
})

The results file which contains data about how input should be mapped to the output is saved in the results directory:

## creates a file in the temp directory
input data

/* expected */
# .test

hello world: input data
/**/

Now when run, zoroaster will use the mask test suite (generated with the makeTestSuite function) to check that inputs match expected outputs.

Specs

Occasionally, there are times when masks are not flexible enough to run tests. Specs are individual test cases, and can access test contexts assigned to the context property of a test suite.

import TempContext from 'temp-context'
import { ok, equal } from '@zoroaster/assert'
import Context from '../context'
import program from '../../src'

/** @type {Object.<string, (c:Context, tc: TempContext)>} */
const T = {
  context: [Context, TempContext],
  async 'writes data to a file'(
    { DATA }, { TEMP, resolve, exists, read },
  ) {
    await program(TEMP, DATA)
    const j = resolve('.test')
    console.log('Temp file location: %s', j)

    const e = await exists('.test')
    ok(e, 'File does not exist.')
    const res = await read('.test')
    equal(res, `hello world: ${DATA}`)
  },
}

export default T

Output

The outcome of all the above tests can be achieved with zoroaster -a example/test/spec example/test/mask command, where -a is used to require alamode -- a fast RegExp-based transpiler of import and export statements.

example/test/spec/default.js
Temp file location: test/temp/.test
  ✓  writes data to a file
 example/test/mask
  ✓  creates a file in the temp directory

🦅  Executed 2 tests.

Autocompletion

One of the advantages of using test context is that they are well documented and it's possible to get auto-completes for available methods when using destructuring on the context argument to a test case, both in masks as well as in specs.

Extending

Extending the TempContext allows to set the specific temp directory location, and/or add additional methods without having to have 2 contexts for testing.

import TempContext from 'temp-context'

export default class MyTempContext extends TempContext {
  constructor() {
    super()
    this._useOSTemp('package-test')
  }
  get DATA() {
    return 'test-data'
  }
}
import { ok, equal } from '@zoroaster/assert'
import MyTempContext from '../context/temp'
import program from '../../src'

/** @type {Object.<string, (tc: MyTempContext)>} */
const T = {
  context: MyTempContext,
  async 'writes data to a file'(
    { TEMP, resolve, exists, read, DATA },
  ) {
    await program(TEMP, DATA)
    const j = resolve('.test')
    console.log('Temp file location: %s', j)

    const e = await exists('.test')
    ok(e, 'File does not exist.')
    const res = await read('.test')
    equal(res, `hello world: ${DATA}`)
  },
}

export default T
example/test/spec/extended.js
Temp file location: /private/var/folders/wj/mc61bmvn3k5_n7q4pfh8rx3w0000gp/T/package-test/.test
  ✓  writes data to a file

🦅  Executed 1 test.

Copyright