Bind history to the recipient session and channel, not the name (closes #148)
check / check (push) Waiting to run
check / check (push) Waiting to run
History was selected by msg_to, so whoever next held a released nick, or created a deleted channel again under its old name, could read the earlier holder's messages. Each message row now records the session a DM or INVITE was sent to (to_session_id) and the channel a channel message was sent to (to_channel_id), and GET /api/v1/history selects by the one that applies, using its index. A session's DM history now also follows it across nick changes. A DM or channel message whose recipient is deleted before it is stored gets the unknown nick or channel error. Model: opus-5-5
This commit was merged in pull request #161.
This commit is contained in:
@@ -619,7 +619,7 @@ func TestInsertMessage(t *testing.T) {
|
||||
body := json.RawMessage(`["hello"]`)
|
||||
|
||||
dbID, msgUUID, err := database.InsertMessage(
|
||||
ctx, "PRIVMSG", "poller", "#test", nil, body, nil,
|
||||
ctx, "PRIVMSG", "poller", "#test", 0, 0, nil, body, nil,
|
||||
)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
@@ -653,7 +653,7 @@ func TestPollMessages(t *testing.T) {
|
||||
body := json.RawMessage(`["hello"]`)
|
||||
|
||||
dbID, _, err := database.InsertMessage(
|
||||
ctx, "PRIVMSG", "poller", "#test", nil, body, nil,
|
||||
ctx, "PRIVMSG", "poller", "#test", 0, 0, nil, body, nil,
|
||||
)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
@@ -706,11 +706,16 @@ func TestGetHistory(t *testing.T) {
|
||||
database := setupTestDB(t)
|
||||
ctx := t.Context()
|
||||
|
||||
chID, err := database.GetOrCreateChannel(ctx, "#hist")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
const msgCount = 10
|
||||
|
||||
for range msgCount {
|
||||
_, _, err := database.InsertMessage(
|
||||
ctx, "PRIVMSG", "user", "#hist",
|
||||
_, _, err = database.InsertMessage(
|
||||
ctx, "PRIVMSG", "user", "#hist", 0, chID,
|
||||
nil, json.RawMessage(`["msg"]`), nil,
|
||||
)
|
||||
if err != nil {
|
||||
@@ -721,7 +726,7 @@ func TestGetHistory(t *testing.T) {
|
||||
const histLimit = 5
|
||||
|
||||
msgs, err := database.GetHistory(
|
||||
ctx, "#hist", "", histLimit,
|
||||
ctx, 0, chID, "", histLimit,
|
||||
)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
@@ -737,6 +742,90 @@ func TestGetHistory(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
// TestGetHistoryReusedNames checks that history follows the
|
||||
// session and the channel row, not the nick or the channel
|
||||
// name: a session that takes a released nick, and a channel
|
||||
// created again under a deleted one's name, start with none.
|
||||
func TestGetHistoryReusedNames(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
database := setupTestDB(t)
|
||||
ctx := t.Context()
|
||||
|
||||
historyLen := func(toSessionID, toChannelID int64) int {
|
||||
t.Helper()
|
||||
|
||||
msgs, err := database.GetHistory(
|
||||
ctx, toSessionID, toChannelID, "", 0,
|
||||
)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
return len(msgs)
|
||||
}
|
||||
|
||||
oldSID, _, _, err := database.CreateSession(
|
||||
ctx, "reused", "", "", "",
|
||||
)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
oldChID, err := database.GetOrCreateChannel(ctx, "#reused")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
body := json.RawMessage(`["hi"]`)
|
||||
|
||||
_, _, err = database.InsertMessage(
|
||||
ctx, "PRIVMSG", "sender", "reused", oldSID, 0,
|
||||
nil, body, nil,
|
||||
)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
_, _, err = database.InsertMessage(
|
||||
ctx, "PRIVMSG", "sender", "#reused", 0, oldChID,
|
||||
nil, body, nil,
|
||||
)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if historyLen(oldSID, 0) != 1 || historyLen(0, oldChID) != 1 {
|
||||
t.Fatal("expected one DM and one channel message")
|
||||
}
|
||||
|
||||
err = database.DeleteSession(ctx, oldSID)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
err = database.DeleteChannelIfEmpty(ctx, oldChID)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
newSID, _, _, err := database.CreateSession(
|
||||
ctx, "reused", "", "", "",
|
||||
)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
newChID, err := database.GetOrCreateChannel(ctx, "#reused")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if historyLen(newSID, 0) != 0 || historyLen(0, newChID) != 0 {
|
||||
t.Fatal("expected no history for the names' new holders")
|
||||
}
|
||||
}
|
||||
|
||||
func TestDeleteSession(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
@@ -863,7 +952,7 @@ func TestEnqueueToClient(t *testing.T) {
|
||||
body := json.RawMessage(`["test"]`)
|
||||
|
||||
dbID, _, err := database.InsertMessage(
|
||||
ctx, "PRIVMSG", "sender", "#ch", nil, body, nil,
|
||||
ctx, "PRIVMSG", "sender", "#ch", 0, 0, nil, body, nil,
|
||||
)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
|
||||
Reference in New Issue
Block a user