diff --git a/src/lib/notifications.ts b/src/lib/notifications.ts index 50f91850..da37e26c 100644 --- a/src/lib/notifications.ts +++ b/src/lib/notifications.ts @@ -44,7 +44,7 @@ export async function createNotification( resourceId, resourceType, actorId, - includeActor, + includeActor = true, issueTitle, machineName, formattedIssueId, diff --git a/src/services/issues.test.ts b/src/services/issues.test.ts index 1b5f97f4..020ad065 100644 --- a/src/services/issues.test.ts +++ b/src/services/issues.test.ts @@ -104,7 +104,6 @@ describe("Issue Service", () => { resourceId: issueId, resourceType: "issue", actorId, - includeActor: true, issueTitle: "Test Issue", machineName: "Test Machine", formattedIssueId: "MM-01", @@ -144,7 +143,6 @@ describe("Issue Service", () => { resourceId: "issue-new", resourceType: "issue", actorId: "user-1", - includeActor: true, issueTitle: "New Issue", machineName: "Test Machine", formattedIssueId: "MM-01", diff --git a/src/services/issues.ts b/src/services/issues.ts index e1ea5859..adac906e 100644 --- a/src/services/issues.ts +++ b/src/services/issues.ts @@ -196,7 +196,6 @@ export async function createIssue({ resourceId: issue.id, resourceType: "issue", ...(reportedBy ? { actorId: reportedBy } : {}), - includeActor: true, issueTitle: title, machineName: updatedMachine.name, formattedIssueId: formatIssueId(machineInitials, issueNumber), @@ -282,7 +281,6 @@ export async function updateIssueStatus({ resourceId: issueId, resourceType: "issue", actorId: userId, - includeActor: true, issueTitle: currentIssue.title, machineName: currentIssue.machine.name, formattedIssueId: formatIssueId( @@ -506,7 +504,6 @@ export async function assignIssue({ resourceId: issueId, resourceType: "issue", actorId, - includeActor: true, issueTitle: currentIssue.title, machineName: currentIssue.machine.name, formattedIssueId: formatIssueId( diff --git a/src/test/integration/database-queries.test.ts b/src/test/integration/database-queries.test.ts index cb527548..0bd85c65 100644 --- a/src/test/integration/database-queries.test.ts +++ b/src/test/integration/database-queries.test.ts @@ -277,7 +277,8 @@ describe("Database Queries (PGlite)", () => { type: "new_issue", resourceId: issue.id, resourceType: "issue", - actorId: "some-other-user-id", // Actor is someone else + actorId: "00000000-0000-0000-0000-000000000002", // Actor is someone else + includeActor: false, // Exclude actor to test global watch behavior issueTitle: "Test Issue", machineName: "Test Machine", issueContext: { diff --git a/src/test/integration/notifications.test.ts b/src/test/integration/notifications.test.ts index 29920799..8bfeff59 100644 --- a/src/test/integration/notifications.test.ts +++ b/src/test/integration/notifications.test.ts @@ -1,5 +1,5 @@ import { describe, it, expect, vi, beforeEach } from "vitest"; -import { eq } from "drizzle-orm"; +import { eq, sql } from "drizzle-orm"; import { createNotification } from "~/lib/notifications"; import { sendEmail } from "~/lib/email/client"; import { getTestDb, setupTestDb } from "~/test/setup/pglite"; @@ -66,6 +66,7 @@ describe("createNotification (Integration)", () => { resourceId: issue.id, resourceType: "issue", actorId: actor.id, + includeActor: false, // Explicitly test actor exclusion commentContent: "Test comment", }, db @@ -77,6 +78,53 @@ describe("createNotification (Integration)", () => { expect(sendEmail).not.toHaveBeenCalled(); }); + it("should notify the actor by default", async () => { + const db = await getTestDb(); + + // Setup: Actor is also a watcher + const [actor] = await db + .insert(userProfiles) + .values(createTestUser()) + .returning(); + const [machine] = await db + .insert(machines) + .values(createTestMachine({ initials: "DEF" })) + .returning(); + const [issue] = await db + .insert(issues) + .values(createTestIssue(machine.initials, { issueNumber: 1 })) + .returning(); + + await db.insert(issueWatchers).values({ + issueId: issue.id, + userId: actor.id, + }); + + // Mock auth.users email for actor + await db.execute( + sql`INSERT INTO auth.users (id, email) VALUES (${actor.id}, 'actor@test.com')` + ); + + // Don't specify includeActor - should default to true + await createNotification( + { + type: "new_comment", + resourceId: issue.id, + resourceType: "issue", + actorId: actor.id, + commentContent: "Test comment", + }, + db + ); + + // Verify actor receives notification (new default behavior) + const result = await db.query.notifications.findMany({ + where: eq(notifications.userId, actor.id), + }); + expect(result).toHaveLength(1); + expect(result[0].type).toBe("new_comment"); + }); + it("should respect main switches", async () => { const db = await getTestDb(); @@ -127,6 +175,7 @@ describe("createNotification (Integration)", () => { resourceId: issue.id, resourceType: "issue", actorId: actor.id, + includeActor: false, // Exclude actor to test recipient preferences commentContent: "Test comment", }, db @@ -186,6 +235,7 @@ describe("createNotification (Integration)", () => { resourceId: issue.id, resourceType: "issue", actorId: actor.id, + includeActor: false, // Exclude actor to test recipient granular toggles commentContent: "Test comment", }, db