171 lines
5.7 KiB
Go
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))
|
|
}
|
|
}
|