chadtmiller.com/knotless

Git hosted in your atproto account, on any stock PDS, fast enough for agents.

git clone knotless://chadtmiller.com/knotless

needs the knotless git helper. set it up

Tests: editing and taking back what was said

chadtmiller.com committed on Oct 22, 2026 parent 4d3a16d commit 9a16a61
Showing 1 changed file with 44 additions and 0 deletions
crates/knotless-serve/tests/forge.rs+44−0
@@ -458,6 +458,50 @@ fn issues_and_who_may_close_them() {
fails(&owner, &["issue", &url, "t", "-m"]);
fails(&owner, &["fork", &owner.url("nothing")]);
// Its author changes what an issue or a comment says, and takes a
// comment back; nobody else can, and the web pages only read.
fails(&owner, &["edit", &url, &issue, "--title", "Hijacked"]);
fails(&author, &["edit", &url, &issue]);
fails(&author, &["edit", &url, &issue, "--sideways", "x"]);
let state = format!("at://{}/dev.knotless.state/3abc", author.account.did);
fails(&author, &["edit", &url, &state, "-m", "x"]);
assert_eq!(
ok(
&author,
&[
"edit",
&url,
&issue,
"--title",
"It breaks badly",
"-m",
"every time"
]
),
"edited"
);
wait_until(|| {
let shown = ok(&owner, &["show", &url, &issue]);
shown.contains("It breaks badly") && shown.contains("every time")
});
ok(&author, &["edit", &url, &issue, "-m", ""]);
wait_until(|| !ok(&owner, &["show", &url, &issue]).contains("every time"));
let said = ok(&author, &["comment", &url, &issue, "first try"]);
fails(&author, &["edit", &url, &said, "--title", "x"]);
fails(&author, &["edit", &url, &said, "-m", ""]);
ok(&author, &["edit", &url, &said, "-m", "second try"]);
wait_until(|| ok(&owner, &["show", &url, &issue]).contains("second try"));
fails(&owner, &["delete-comment", &url, &said]);
fails(&author, &["delete-comment", &url, &issue]);
assert_eq!(ok(&author, &["delete-comment", &url, &said]), "deleted");
wait_until(|| !ok(&owner, &["show", &url, &issue]).contains("second try"));
// One gone, or about another repository, is not there to change.
fails(&author, &["delete-comment", &url, &said]);
fails(
&author,
&["edit", &owner.url("elsewhere"), &issue, "--title", "x"],
);
// Without an appview there is nowhere to find them.
let mut lost = person(owner.account.clone(), &av);
lost.set("KNOTLESS_APPVIEW", "");