mirror of
https://github.com/block/buzz.git
synced 2026-08-18 06:50:31 +02:00
## Summary - adopt the finalized NIP-MP project model so one project can enumerate and switch between multiple NIP-34 repositories - add project and repository navigation, activity summaries, existing-repository attachment, and repository access-channel management - preserve privacy-safe activation provenance for agent-authored patches, pull requests, issues, and associated commits ## Test plan - [x] Run desktop typecheck and unit tests - [x] Run focused NIP-MP, repository access, and provenance tests - [x] Run Rust formatting and desktop lint checks - [x] Run the complete pre-push suite after merging current `main` - [ ] Manually verify project creation, repository attachment, switching, and access repair on staging - [ ] Manually verify public-channel and private-agent origin labels on newly created Git activity Related: [#4695](https://github.com/block/buzz/pull/4695) --------- Signed-off-by: Thomas Petersen <thomasp@squareup.com> Signed-off-by: Will Pfleger <pfleger.will@gmail.com> Co-authored-by: npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@buzz.block.builderlab.xyz> Co-authored-by: Will Pfleger <pfleger.will@gmail.com>
73 lines
2.5 KiB
TypeScript
73 lines
2.5 KiB
TypeScript
import { expect, test } from "@playwright/test";
|
|
|
|
import { installMockBridge } from "../helpers/bridge";
|
|
|
|
const ISSUE_COMMENTS = [
|
|
"First issue comment",
|
|
"Second issue comment",
|
|
"Third issue comment",
|
|
"Fourth issue comment",
|
|
];
|
|
|
|
async function openBuzzProject(page: import("@playwright/test").Page) {
|
|
await page.goto("/", { waitUntil: "domcontentloaded" });
|
|
await page.getByTestId("open-projects-view").click();
|
|
await page.getByTestId("projects-section-projects").click();
|
|
const projectEntry = page
|
|
.locator(
|
|
'[data-testid="project-card-buzz"], [data-testid="project-row-buzz"]',
|
|
)
|
|
.first();
|
|
await expect(projectEntry).toBeVisible({ timeout: 10_000 });
|
|
await projectEntry.click();
|
|
}
|
|
|
|
test("issue comments use the project activity timeline", async ({ page }) => {
|
|
await installMockBridge(page);
|
|
await openBuzzProject(page);
|
|
|
|
await page.getByRole("tab", { name: "Issues", exact: true }).click();
|
|
const issueRow = page.getByTestId("project-issue-row").first();
|
|
await expect(issueRow).toBeVisible({ timeout: 10_000 });
|
|
await issueRow.getByRole("button", { name: /^#/ }).click();
|
|
|
|
const composer = page.getByTestId("project-issue-comment-composer");
|
|
await expect(composer).toBeVisible();
|
|
|
|
for (const comment of ISSUE_COMMENTS) {
|
|
await composer.locator('[contenteditable="true"]').fill(comment);
|
|
await composer.getByRole("button", { name: "Send message" }).click();
|
|
await expect(page.getByText(comment, { exact: true })).toBeVisible({
|
|
timeout: 10_000,
|
|
});
|
|
}
|
|
|
|
const timelineRows = page.getByTestId("project-issue-comment-timeline-row");
|
|
const earlierComments = page.getByTestId("project-issue-earlier-comments");
|
|
const historyToggle = page.getByTestId(
|
|
"project-issue-comment-history-toggle",
|
|
);
|
|
|
|
await expect(timelineRows).toHaveCount(3);
|
|
await expect(earlierComments).toContainText("Show 1 earlier comment");
|
|
await expect(
|
|
timelineRows.filter({ hasText: "First issue comment" }),
|
|
).toHaveCount(0);
|
|
await expect(
|
|
timelineRows.filter({ hasText: "Fourth issue comment" }),
|
|
).toHaveCount(1);
|
|
|
|
await earlierComments.click();
|
|
await expect(timelineRows).toHaveCount(4);
|
|
for (const comment of ISSUE_COMMENTS) {
|
|
await expect(timelineRows.filter({ hasText: comment })).toHaveCount(1);
|
|
}
|
|
|
|
await historyToggle.click();
|
|
await expect(timelineRows).toHaveCount(0);
|
|
await expect(historyToggle).toContainText("Show 4 earlier comments");
|
|
|
|
await historyToggle.click();
|
|
await expect(timelineRows).toHaveCount(4);
|
|
});
|