-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathunicode_test.go
More file actions
149 lines (121 loc) · 4.69 KB
/
unicode_test.go
File metadata and controls
149 lines (121 loc) · 4.69 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
package gomongo_test
import (
"context"
"fmt"
"testing"
"github.com/bytebase/gomongo"
"github.com/bytebase/gomongo/internal/testutil"
"github.com/stretchr/testify/require"
)
func TestUnicodeInsertAndQuery(t *testing.T) {
testutil.RunOnAllDBs(t, func(t *testing.T, db testutil.TestDB) {
dbName := fmt.Sprintf("testdb_unicode_%s", db.Name)
defer testutil.CleanupDatabase(t, db.Client, dbName)
ctx := context.Background()
gc := gomongo.NewClient(db.Client)
// Insert CJK document
_, err := gc.Execute(ctx, dbName, `db.users.insertOne({"name": "张三", "city": "北京"})`)
require.NoError(t, err)
// Query by unicode field value
result, err := gc.Execute(ctx, dbName, `db.users.findOne({"name": "张三"})`)
require.NoError(t, err)
require.Equal(t, 1, len(result.Value))
row := valueToJSON(result.Value[0])
require.Contains(t, row, "张三")
require.Contains(t, row, "北京")
})
}
func TestUnicodeArabic(t *testing.T) {
testutil.RunOnAllDBs(t, func(t *testing.T, db testutil.TestDB) {
dbName := fmt.Sprintf("testdb_arabic_%s", db.Name)
defer testutil.CleanupDatabase(t, db.Client, dbName)
ctx := context.Background()
gc := gomongo.NewClient(db.Client)
// Insert Arabic document
_, err := gc.Execute(ctx, dbName, `db.users.insertOne({"name": "محمد", "city": "القاهرة"})`)
require.NoError(t, err)
// Query by Arabic field value
result, err := gc.Execute(ctx, dbName, `db.users.findOne({"name": "محمد"})`)
require.NoError(t, err)
require.Equal(t, 1, len(result.Value))
row := valueToJSON(result.Value[0])
require.Contains(t, row, "محمد")
})
}
func TestUnicodeEmoji(t *testing.T) {
testutil.RunOnAllDBs(t, func(t *testing.T, db testutil.TestDB) {
dbName := fmt.Sprintf("testdb_emoji_%s", db.Name)
defer testutil.CleanupDatabase(t, db.Client, dbName)
ctx := context.Background()
gc := gomongo.NewClient(db.Client)
// Insert document with emoji
_, err := gc.Execute(ctx, dbName, `db.users.insertOne({"name": "Test 🎉", "tags": ["🔥", "✨"]})`)
require.NoError(t, err)
// Query and verify emoji preserved
result, err := gc.Execute(ctx, dbName, `db.users.findOne({})`)
require.NoError(t, err)
require.Equal(t, 1, len(result.Value))
row := valueToJSON(result.Value[0])
require.Contains(t, row, "🎉")
require.Contains(t, row, "🔥")
})
}
func TestUnicodeInCollectionName(t *testing.T) {
testutil.RunOnAllDBs(t, func(t *testing.T, db testutil.TestDB) {
dbName := fmt.Sprintf("testdb_unicode_coll_%s", db.Name)
defer testutil.CleanupDatabase(t, db.Client, dbName)
ctx := context.Background()
gc := gomongo.NewClient(db.Client)
// Insert into unicode-named collection
_, err := gc.Execute(ctx, dbName, `db["用户表"].insertOne({"name": "test"})`)
require.NoError(t, err)
// Query unicode-named collection
result, err := gc.Execute(ctx, dbName, `db["用户表"].find()`)
require.NoError(t, err)
require.Equal(t, 1, len(result.Value))
})
}
func TestUnicodeEmojiInCollectionName(t *testing.T) {
testutil.RunOnAllDBs(t, func(t *testing.T, db testutil.TestDB) {
dbName := fmt.Sprintf("testdb_emoji_coll_%s", db.Name)
defer testutil.CleanupDatabase(t, db.Client, dbName)
ctx := context.Background()
gc := gomongo.NewClient(db.Client)
// Insert into emoji-named collection
_, err := gc.Execute(ctx, dbName, `db["users🎉"].insertOne({"name": "test"})`)
require.NoError(t, err)
// Query emoji-named collection
result, err := gc.Execute(ctx, dbName, `db["users🎉"].find()`)
require.NoError(t, err)
require.Equal(t, 1, len(result.Value))
})
}
func TestUnicodeRoundTrip(t *testing.T) {
testutil.RunOnAllDBs(t, func(t *testing.T, db testutil.TestDB) {
dbName := fmt.Sprintf("testdb_roundtrip_%s", db.Name)
defer testutil.CleanupDatabase(t, db.Client, dbName)
ctx := context.Background()
gc := gomongo.NewClient(db.Client)
// Load unicode fixture
docs, err := testutil.LoadFixtureAsAny("unicode_samples.json")
require.NoError(t, err)
// Insert all unicode samples using driver directly
collection := db.Client.Database(dbName).Collection("samples")
_, err = collection.InsertMany(ctx, docs)
require.NoError(t, err)
// Query each and verify round-trip integrity
result, err := gc.Execute(ctx, dbName, `db.samples.find()`)
require.NoError(t, err)
require.Equal(t, len(docs), len(result.Value))
// Spot check specific unicode values
allRows := ""
for _, v := range result.Value {
allRows += valueToJSON(v)
}
require.Contains(t, allRows, "张三") // Chinese
require.Contains(t, allRows, "田中太郎") // Japanese
require.Contains(t, allRows, "김철수") // Korean
require.Contains(t, allRows, "محمد") // Arabic
require.Contains(t, allRows, "🎉") // Emoji
})
}