# Semi-persistent, scoped test directories
This crate aims to make it easier to use temporary directories in
tests, primarily by calling the `testdir!()` macro somewhere in a test
function. The direcetories are structured per-scope and per-test and
will be available for inspection after the test has finished. On
subsequent test runs older generations of test directories will be
cleaned up.
If you've ever used [pytest's `tmp_path` or `tmpdir`
fixtures](https://docs.pytest.org/en/stable/reference.html#tmp-path)
this pattern should be similar.
By default test directories are created in cargo's target directory:
```
target/testdir-$N/module/path/test_name
```
Here `$N` is an integer generation number increasing with each `cargo
test` invocation. Generations older than the 8 most recent ones are
removed on the next `cargo test` run.
There is also a symlink pointing to the most recent generation:
```
target/testdir-current -> testdir-$N`
```
Note however that on windows sometimes this can not be updated due to
permissions, this symlink is a best-effort on windows.
## Example
Even when executing this with `cargo test --jobs=1` these tests will
pass as each gets their own unique directory:
```no_run
// E.g. in lib.rs
mod tests {
use std::path::PathBuf;
use testdir::testdir;
#[test]
fn test_write() {
let dir: PathBuf = testdir!();
let path = dir.join("hello.txt");
std::fs::write(&path, "hi there").ok();
assert!(path.exists());
}
#[test]
fn test_read() {
let dir: PathBuf = testdir!();
let path = dir.join("hello.txt");
assert!(!path.exists());
}
}
```
Afterwards you can inspect the directories and they should look
something like this:
```text
$ tree target/
target/
+- testdir-0
| +- cratename
| +- tests
| +- test_read
| +- test_write
| +- hello.txt
+- testdir-current -> testdir-0
```
## Feedback and contributing
The code lives in a git repository at https://github.com/flub/testdir
from which you can create issues, clone the repository and create pull
requests.