/
unittest_util.go
158 lines (134 loc) · 4.71 KB
/
unittest_util.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
154
155
156
157
158
package test
import (
"encoding/json"
"fmt"
"net/http"
"net/http/httptest"
"strings"
"github.com/labstack/echo/v4"
"github.com/ybkuroki/go-webapp-sample/config"
"github.com/ybkuroki/go-webapp-sample/container"
"github.com/ybkuroki/go-webapp-sample/logger"
"github.com/ybkuroki/go-webapp-sample/middleware"
"github.com/ybkuroki/go-webapp-sample/migration"
"github.com/ybkuroki/go-webapp-sample/repository"
"github.com/ybkuroki/go-webapp-sample/session"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"go.uber.org/zap/zaptest/observer"
)
// PrepareForControllerTest func prepares the controllers for testing.
func PrepareForControllerTest(isSecurity bool) (*echo.Echo, container.Container) {
e := echo.New()
conf := createConfig(isSecurity)
logger := initTestLogger()
container := initContainer(conf, logger)
middleware.InitLoggerMiddleware(e, container)
migration.CreateDatabase(container)
migration.InitMasterData(container)
middleware.InitSessionMiddleware(e, container)
return e, container
}
// PrepareForServiceTest func prepares the services for testing.
func PrepareForServiceTest() container.Container {
conf := createConfig(false)
logger := initTestLogger()
container := initContainer(conf, logger)
migration.CreateDatabase(container)
migration.InitMasterData(container)
return container
}
// PrepareForLoggerTest func prepares the loggers for testing.
func PrepareForLoggerTest() (*echo.Echo, container.Container, *observer.ObservedLogs) {
e := echo.New()
conf := createConfig(false)
logger, observedLogs := initObservedLogger()
container := initContainer(conf, logger)
migration.CreateDatabase(container)
migration.InitMasterData(container)
middleware.InitSessionMiddleware(e, container)
middleware.InitLoggerMiddleware(e, container)
return e, container, observedLogs
}
func createConfig(isSecurity bool) *config.Config {
conf := &config.Config{}
conf.Database.Dialect = "sqlite3"
conf.Database.Host = "file::memory:?cache=shared"
conf.Database.Migration = true
conf.Extension.MasterGenerator = true
conf.Extension.SecurityEnabled = isSecurity
conf.Log.RequestLogFormat = "${remote_ip} ${account_name} ${uri} ${method} ${status}"
return conf
}
func initContainer(conf *config.Config, logger logger.Logger) container.Container {
rep := repository.NewBookRepository(logger, conf)
sess := session.NewSession(logger, conf)
messages := map[string]string{
"ValidationErrMessageBookTitle": "Please enter the title with 3 to 50 characters.",
"ValidationErrMessageBookISBN": "Please enter the ISBN with 10 to 20 characters."}
container := container.NewContainer(rep, sess, conf, messages, logger, "test")
return container
}
func initTestLogger() logger.Logger {
myConfig := createLoggerConfig()
zap, err := myConfig.Build()
if err != nil {
fmt.Printf("Error")
}
sugar := zap.Sugar()
// set package varriable logger.
logger := logger.NewLogger(sugar)
logger.GetZapLogger().Infof("Success to read zap logger configuration")
_ = zap.Sync()
return logger
}
func initObservedLogger() (logger.Logger, *observer.ObservedLogs) {
observedZapCore, observedLogs := observer.New(zap.DebugLevel)
sugar := zap.New(observedZapCore).Sugar()
// set package varriable logger.
logger := logger.NewLogger(sugar)
return logger, observedLogs
}
func createLoggerConfig() zap.Config {
level := zap.NewAtomicLevel()
level.SetLevel(zapcore.DebugLevel)
return zap.Config{
Level: level,
Encoding: "console",
Development: true,
EncoderConfig: zapcore.EncoderConfig{
TimeKey: "Time",
LevelKey: "Level",
NameKey: "Name",
CallerKey: "Caller",
MessageKey: "Msg",
StacktraceKey: "St",
EncodeLevel: zapcore.CapitalLevelEncoder,
EncodeTime: zapcore.ISO8601TimeEncoder,
EncodeDuration: zapcore.StringDurationEncoder,
EncodeCaller: zapcore.ShortCallerEncoder,
},
OutputPaths: []string{"stdout"},
ErrorOutputPaths: []string{"stderr"},
}
}
// ConvertToString func converts model to string.
func ConvertToString(model interface{}) string {
bytes, _ := json.Marshal(model)
return string(bytes)
}
// NewJSONRequest func creates a new request using JSON format.
func NewJSONRequest(method string, target string, param interface{}) *http.Request {
req := httptest.NewRequest(method, target, strings.NewReader(ConvertToString(param)))
req.Header.Add("Content-Type", "application/json")
req.Header.Add("Accept", "application/json")
return req
}
// GetCookie func gets a cookie from a HTTP request.
func GetCookie(rec *httptest.ResponseRecorder, cookieName string) string {
parser := &http.Request{Header: http.Header{"Cookie": rec.Header()["Set-Cookie"]}}
if cookie, err := parser.Cookie(cookieName); cookie != nil && err == nil {
return cookie.Value
}
return ""
}