-
Notifications
You must be signed in to change notification settings - Fork 0
/
gorm_test.go
153 lines (143 loc) · 4.16 KB
/
gorm_test.go
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
150
151
152
153
package f8n
import (
"database/sql"
"errors"
"fmt"
"net/http"
"strings"
"testing"
"github.com/webnice/f8n/testdb"
"gorm.io/gorm"
)
func testGorm(t *testing.T) (ret *gorm.DB) {
var (
err error
sqlDB *sql.DB
rows *sql.Rows
tmp string
tables []string
isChildren bool
isParents bool
)
ret = testdb.DB
if sqlDB, err = ret.DB(); err != nil {
t.Errorf("DB(). Ошибка не ожидалась. Ошибка: %s", err)
}
if rows, err = sqlDB.Query("SELECT `name` FROM `sqlite_master` WHERE type=? ORDER BY `name`", "table"); err != nil {
t.Errorf("Query(). Ошибка не ожидалась. Ошибка: %s", err)
}
for rows.Next() {
if err = rows.Scan(&tmp); err != nil {
t.Errorf("Scan(). Ошибка не ожидалась. Ошибка: %s", err)
}
if tmp == "children" {
isChildren = true
}
if tmp == "parents" {
isParents = true
}
tables = append(tables, tmp)
}
// Проверка создались ли в базе данных таблицы для тестирования.
if !isChildren || !isParents {
t.Errorf(
"Не верные таблицы для тестирования. В базе данных таблицы: %v, ожидались: %v.",
tables, []string{"children", "parents"},
)
}
return
}
// Тестирование вызова функции с не инициализированным объектом orm.
func TestGormNil(t *testing.T) {
var (
err error
f8n Interface
orm *gorm.DB
ero Err
ok bool
)
f8n = New()
if orm, err = f8n.Gorm(orm); err == nil {
t.Errorf("Gorm(). Ожидалась ошибка.")
}
if orm != nil {
t.Errorf("Gorm(). Ожидался объект равный nil.")
}
if ero, ok = err.(Err); !ok {
t.Errorf("Gorm() = %q, не верный тип ошибки.", err)
return
}
if !errors.Is(ero.Anchor(), f8n.Errors().OrmIsNil().Anchor()) {
t.Errorf("Gorm(). Ошибка: %q, ожидалась: %q", ero.Error(), f8n.Errors().OrmIsNil().Error())
return
}
}
// Тестирование создания ORM условий запроса.
func TestGorm(t *testing.T) {
const qTpl = `http://localhost?%s`
type (
ft struct {
Field string
Type FieldType
}
gs struct {
Urn string
Fields []ft
Query string
}
)
var (
err error
rq *http.Request
f8n Interface
orm *gorm.DB
dryOrm *gorm.DB
stmt *gorm.Statement
tmp testdb.Child
query string
rexQuery []string
n, j int
tests = []gs{
{
Urn: "filter=id:eq:1",
Fields: []ft{{Field: "id", Type: TypeUint64}, {Field: "key", Type: TypeInt64}},
Query: "`id` = 1",
},
{
Urn: "filter=id:le:11&filter=key:ge:-32",
Fields: []ft{{Field: "id", Type: TypeUint64}, {Field: "key", Type: TypeInt64}},
Query: "`id` <= 11 AND `key` >= -32",
},
}
)
f8n, orm = New(), testGorm(t)
for n = range tests {
// Создание запроса.
if rq, err = http.NewRequest("GET", fmt.Sprintf(qTpl, tests[n].Urn), nil); err != nil {
t.Errorf("Ошибка создания запроса: %s", err)
}
// Подготовка объекта фильтрации.
f8n.Reset()
for j = range tests[n].Fields {
f8n.FieldDatatype(tests[n].Fields[j].Field, tests[n].Fields[j].Type)
}
// Разбор запроса.
if err = f8n.ParseRequest(rq); err != nil {
t.Errorf("ParseRequest(). Ошибка не ожидалась. Ошибка: %s", err)
}
// Добавление условий из запроса в ORM.
dryOrm = orm.Session(&gorm.Session{DryRun: true})
if dryOrm, err = f8n.Gorm(dryOrm); err != nil {
t.Errorf("Gorm(). Ошибка не ожидалась. Ошибка: %s", err)
}
stmt = dryOrm.Find(&tmp).Statement
query = orm.Dialector.Explain(stmt.SQL.String(), stmt.Vars...)
if rexQuery = testdb.RexWhere.FindStringSubmatch(query); len(rexQuery) < 4 {
t.Errorf("SQL запрос: %s", query)
}
if !strings.EqualFold(rexQuery[3], tests[n].Query) {
t.Log("Ошибка формирования запроса.")
t.Errorf("Получен запрос:\n %q, ожидался:\n %q", rexQuery[3], tests[n].Query)
}
}
}