{
  lib,
  testers,
  writeText,
  drv, # The derivation under test
}:
let
  toFile = name: v: if lib.isPath v then v else writeText name v;

  overrideSrc =
    src:
    drv.overrideAttrs {
      inherit src;
    };

  expectEqualContent =
    {
      message,
      expected,
      input,
    }:
    testers.testEqualContents {
      assertion = message;
      actual = overrideSrc (toFile "${message}-input" input);
      expected = toFile "${message}-expected" expected;
    };
in
# TODO: introduce some negative cases for input that should fail
{
  maintainers = expectEqualContent {
    message = "integration test: maintainers";
    input = ''
      [[config]]
      owner = "GaetanLepage"
      title = "nix-config"
      description = "Home-manager"
      url = "https://github.com/GaetanLepage/nix-config/tree/master/home/modules/tui/neovim"

      [[config]]
      owner = "khaneliman"
      repo = "khanelivim"
      description = "Constantly tweaked jack of all trades development focused configuration."

      [[config]]
      owner = "MattSturgeon"
      repo = "nix-config"

      [[config]]
      owner = "traxys"
      title = "Nixfiles"
      url = "https://github.com/traxys/Nixfiles/tree/master/neovim"
    '';
    expected = ''
      | Owner | Config | Comment |
      |-------|--------|---------|
      | [GaetanLepage](https://github.com/GaetanLepage) | [nix-config](https://github.com/GaetanLepage/nix-config/tree/master/home/modules/tui/neovim) | Home-manager |
      | [khaneliman](https://github.com/khaneliman) | [khanelivim](https://github.com/khaneliman/khanelivim) | Constantly tweaked jack of all trades development focused configuration. |
      | [MattSturgeon](https://github.com/MattSturgeon) | [nix-config](https://github.com/MattSturgeon/nix-config) |  |
      | [traxys](https://github.com/traxys) | [Nixfiles](https://github.com/traxys/Nixfiles/tree/master/neovim) |  |
    '';
  };

  simple = expectEqualContent {
    message = "unit test: simple";
    input = ''
      [[config]]
      owner = "Simon"
      title = "Says"
      url = "url"
    '';
    expected = ''
      | Owner | Config | Comment |
      |-------|--------|---------|
      | [Simon](https://github.com/Simon) | [Says](url) |  |
    '';
  };

  simple-description = expectEqualContent {
    message = "unit test: simple with description";
    input = ''
      [[config]]
      owner = "Simon"
      title = "Says"
      url = "url"
      description = "desc"
    '';
    expected = ''
      | Owner | Config | Comment |
      |-------|--------|---------|
      | [Simon](https://github.com/Simon) | [Says](url) | desc |
    '';
  };

  description-with-lines = expectEqualContent {
    message = "unit test: description with linebreaks";
    input = ''
      [[config]]
      owner = "sloppy"
      title = "title"
      url = "url"
      description = """

      This description

      Contains

      Many
      Line
      breaks


      """
    '';
    expected = ''
      | Owner | Config | Comment |
      |-------|--------|---------|
      | [sloppy](https://github.com/sloppy) | [title](url) | This description Contains Many Line breaks |
    '';
  };

  title-with-lines = expectEqualContent {
    message = "unit test: title with linebreaks";
    input = ''
      [[config]]
      owner = "sloppy"
      title = """

      This title

      Contains

      Many
      Line
      breaks


      """
      url = "url"
    '';
    expected = ''
      | Owner | Config | Comment |
      |-------|--------|---------|
      | [sloppy](https://github.com/sloppy) | [This title Contains Many Line breaks](url) |  |
    '';
  };
}
