Files
scheduler-backend/internal/urlrewrite/rewrite_test.go
2026-05-28 00:16:19 +08:00

171 lines
5.7 KiB
Go

package urlrewrite
import (
"encoding/json"
"reflect"
"testing"
)
func TestRewriteStringValue(t *testing.T) {
oldPrefix := "https://s3.jizhying.com/images/"
newPrefix := "https://dp9pkdckmd09t.cloudfront.net/"
tests := []struct {
name string
input string
want string
}{
{
name: "replace matching prefix",
input: "https://s3.jizhying.com/images/openim/data/hash/a.jpg",
want: "https://dp9pkdckmd09t.cloudfront.net/openim/data/hash/a.jpg",
},
{
name: "keep non matching url",
input: "https://example.com/a.jpg",
want: "https://example.com/a.jpg",
},
{
name: "keep plain text",
input: "hello",
want: "hello",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, changed := rewriteStringValue(tt.input, oldPrefix, newPrefix)
if got != tt.want {
t.Fatalf("rewriteStringValue() = %q, want %q", got, tt.want)
}
if (tt.input != tt.want) != changed {
t.Fatalf("rewriteStringValue() changed = %v, want %v", changed, tt.input != tt.want)
}
})
}
}
func TestRewriteJSONContent(t *testing.T) {
oldPrefix := "https://s3.jizhying.com/images/"
newPrefix := "https://dp9pkdckmd09t.cloudfront.net/"
input := `{"sourcePicture":{"url":"https://s3.jizhying.com/images/openim/data/hash/src.jpg"},"snapshotPicture":{"url":"https://s3.jizhying.com/images/openim/data/hash/snap.jpg"},"nested":{"fileElem":{"sourceUrl":"https://s3.jizhying.com/images/openim/data/hash/file.zip"}}}`
want := `{"nested":{"fileElem":{"sourceUrl":"https://dp9pkdckmd09t.cloudfront.net/openim/data/hash/file.zip"}},"snapshotPicture":{"url":"https://dp9pkdckmd09t.cloudfront.net/openim/data/hash/snap.jpg"},"sourcePicture":{"url":"https://dp9pkdckmd09t.cloudfront.net/openim/data/hash/src.jpg"}}`
got, changed, err := rewriteJSONContent(input, oldPrefix, newPrefix)
if err != nil {
t.Fatalf("rewriteJSONContent() error = %v", err)
}
if !changed {
t.Fatalf("rewriteJSONContent() changed = false, want true")
}
if got != want {
t.Fatalf("rewriteJSONContent() = %s, want %s", got, want)
}
}
func TestRewriteJSONContentNestedJSONString(t *testing.T) {
oldPrefix := "https://s3.jizhying.com/images/"
newPrefix := "https://dp9pkdckmd09t.cloudfront.net/"
input := `{"detail":"{\"group\":{\"faceURL\":\"https://s3.jizhying.com/images/openim/data/hash/group.jpg\"},\"entrantUser\":{\"faceURL\":\"https://s3.jizhying.com/images/openim/data/hash/user.jpg\"}}"}`
want := `{"detail":"{\"group\":{\"faceURL\":\"https://dp9pkdckmd09t.cloudfront.net/openim/data/hash/group.jpg\"},\"entrantUser\":{\"faceURL\":\"https://dp9pkdckmd09t.cloudfront.net/openim/data/hash/user.jpg\"}}"}`
got, changed, err := rewriteJSONContent(input, oldPrefix, newPrefix)
if err != nil {
t.Fatalf("rewriteJSONContent() error = %v", err)
}
if !changed {
t.Fatalf("rewriteJSONContent() changed = false, want true")
}
var gotValue map[string]any
var wantValue map[string]any
if err := json.Unmarshal([]byte(got), &gotValue); err != nil {
t.Fatalf("unmarshal got error = %v", err)
}
if err := json.Unmarshal([]byte(want), &wantValue); err != nil {
t.Fatalf("unmarshal want error = %v", err)
}
var gotDetail any
var wantDetail any
if err := json.Unmarshal([]byte(gotValue["detail"].(string)), &gotDetail); err != nil {
t.Fatalf("unmarshal got detail error = %v", err)
}
if err := json.Unmarshal([]byte(wantValue["detail"].(string)), &wantDetail); err != nil {
t.Fatalf("unmarshal want detail error = %v", err)
}
gotValue["detail"] = gotDetail
wantValue["detail"] = wantDetail
if !reflect.DeepEqual(gotValue, wantValue) {
t.Fatalf("rewriteJSONContent() = %#v, want %#v", gotValue, wantValue)
}
}
func TestRewriteJSONContentInvalidJSON(t *testing.T) {
_, changed, err := rewriteJSONContent("not-json", "https://old/", "https://new/")
if err == nil {
t.Fatalf("rewriteJSONContent() error = nil, want non-nil")
}
if changed {
t.Fatalf("rewriteJSONContent() changed = true, want false")
}
}
func TestCollectMsgFieldUpdates(t *testing.T) {
oldPrefix := "https://s3.jizhying.com/images/"
newPrefix := "https://dp9pkdckmd09t.cloudfront.net/"
doc := msgDoc{
Doc: "si_a_b:0",
Msgs: []msgEntryModel{
{
Msg: &msgPayload{
Content: `{"sourcePicture":{"url":"https://s3.jizhying.com/images/openim/data/hash/1.jpg"}}`,
SenderFaceURL: "https://s3.jizhying.com/images/openim/data/hash/avatar.jpg",
},
},
{
Msg: &msgPayload{
Content: `{"text":"hello"}`,
SenderFaceURL: "",
},
},
},
}
updates, changed, samples := collectMsgFieldUpdates(doc, oldPrefix, newPrefix, 5)
if !changed {
t.Fatalf("collectMsgFieldUpdates() changed = false, want true")
}
if len(samples) != 2 {
t.Fatalf("collectMsgFieldUpdates() samples len = %d, want 2", len(samples))
}
if len(updates) != 2 {
t.Fatalf("collectMsgFieldUpdates() updates len = %d, want 2", len(updates))
}
if updates[0].Path != "msgs.0.msg.content" {
t.Fatalf("first update path = %s", updates[0].Path)
}
if updates[0].NewValue != `{"sourcePicture":{"url":"https://dp9pkdckmd09t.cloudfront.net/openim/data/hash/1.jpg"}}` {
t.Fatalf("content update = %s", updates[0].NewValue)
}
if updates[1].Path != "msgs.0.msg.sender_face_url" {
t.Fatalf("second update path = %s", updates[1].Path)
}
if updates[1].NewValue != "https://dp9pkdckmd09t.cloudfront.net/openim/data/hash/avatar.jpg" {
t.Fatalf("sender_face_url update = %s", updates[1].NewValue)
}
}
func TestBuildBackupDocs(t *testing.T) {
updates := []fieldUpdate{
{Path: "face_url", OldValue: "https://old/a.jpg", NewValue: "https://new/a.jpg"},
{Path: "thumbnail", OldValue: "https://old/b.jpg", NewValue: "https://new/b.jpg"},
}
docs := buildBackupDocs("batch-1", "attributes", "doc-1", updates)
if len(docs) != 2 {
t.Fatalf("buildBackupDocs() len = %d, want 2", len(docs))
}
}