@@ -2,16 +2,16 @@ package database
22
33import (
44 "database/sql"
5+ "fmt"
56 "musicboxapi/logging"
67 "regexp"
78 "testing"
89
910 "github.com/DATA-DOG/go-sqlmock"
1011 _ "github.com/lib/pq"
12+ "github.com/stretchr/testify/assert"
1113)
1214
13- var Mock sqlmock.Sqlmock
14-
1515func CreateMockDb () (* sql.DB , sqlmock.Sqlmock , error ) {
1616 db , mock , err := sqlmock .New ()
1717
@@ -119,3 +119,150 @@ func TestNonScalarQueryShouldThrowErrt(t *testing.T) {
119119 t .Errorf ("NonScalarQuery failed: %s" , result )
120120 }
121121}
122+
123+ func TestQueryRow (t * testing.T ) {
124+ // Arrange
125+ query := "SELECT Id, Name, Online FROM data"
126+ db , mock , err := CreateMockDb ()
127+
128+ if err != nil {
129+ logging .ErrorStackTrace (err )
130+ return
131+ }
132+
133+ base := NewBaseTableInstance ()
134+ base .DB = db
135+
136+ mock .ExpectQuery (query ).
137+ WillReturnRows (sqlmock .NewRows ([]string {"Id" , "Name" , "Online" }).AddRow (1 , "Test" , false ))
138+
139+ // Act
140+ rows := base .QueryRow (query )
141+
142+ // Assert
143+ err = mock .ExpectationsWereMet ()
144+
145+ if err != nil {
146+ t .Errorf ("Expectations failed: %s" , err )
147+ }
148+
149+ var id int
150+ var name string
151+ var online bool
152+
153+ rows .Scan (& id , & name , & online )
154+
155+ assert .Equal (t , 1 , id )
156+ assert .Equal (t , "Test" , name )
157+ assert .Equal (t , false , online )
158+ }
159+
160+ func TestQueryRows (t * testing.T ) {
161+ // Arrange
162+ query := "SELECT Id, Name, Online FROM data"
163+ db , mock , err := CreateMockDb ()
164+
165+ if err != nil {
166+ logging .ErrorStackTrace (err )
167+ return
168+ }
169+
170+ base := NewBaseTableInstance ()
171+ base .DB = db
172+
173+ mock .ExpectQuery (query ).
174+ WillReturnRows (sqlmock .NewRows ([]string {"Id" , "Name" , "Online" }).AddRow (1 , "Test" , false ).AddRow (2 , "Test2" , true ))
175+
176+ // Act
177+ rows , err := base .QueryRows (query )
178+
179+ assert .Nil (t , err )
180+
181+ defer rows .Close ()
182+
183+ // Assert
184+ err = mock .ExpectationsWereMet ()
185+
186+ if err != nil {
187+ t .Errorf ("Expectations failed: %s" , err )
188+ }
189+
190+ type Data struct {
191+ id int
192+ name string
193+ online bool
194+ }
195+
196+ var datas []Data
197+ var data Data
198+
199+ datas = make ([]Data , 0 )
200+
201+ for rows .Next () {
202+ scanError := rows .Scan (& data .id , & data .name , & data .online )
203+
204+ if scanError != nil {
205+ logging .Error (fmt .Sprintf ("Scan error: %s" , scanError .Error ()))
206+ continue
207+ }
208+
209+ datas = append (datas , data )
210+ }
211+
212+ assert .Equal (t , 2 , len (datas ))
213+ }
214+
215+ func TestQueryRowsContext (t * testing.T ) {
216+ // Arrange
217+ query := "SELECT Id, Name, Online FROM data"
218+ db , mock , err := CreateMockDb ()
219+
220+ if err != nil {
221+ logging .ErrorStackTrace (err )
222+ return
223+ }
224+
225+ base := NewBaseTableInstance ()
226+ base .DB = db
227+
228+ mock .ExpectQuery (query ).
229+ WillReturnRows (sqlmock .NewRows ([]string {"Id" , "Name" , "Online" }).AddRow (1 , "Test" , false ).AddRow (2 , "Test2" , true ))
230+
231+ // Act
232+ rows , err := base .QueryRowsContex (t .Context (), query )
233+
234+ assert .Nil (t , err )
235+
236+ defer rows .Close ()
237+
238+ // Assert
239+ err = mock .ExpectationsWereMet ()
240+
241+ if err != nil {
242+ t .Errorf ("Expectations failed: %s" , err )
243+ }
244+
245+ type Data struct {
246+ id int
247+ name string
248+ online bool
249+ }
250+
251+ var datas []Data
252+ var data Data
253+
254+ datas = make ([]Data , 0 )
255+
256+ for rows .Next () {
257+ scanError := rows .Scan (& data .id , & data .name , & data .online )
258+
259+ if scanError != nil {
260+ logging .Error (fmt .Sprintf ("Scan error: %s" , scanError .Error ()))
261+ continue
262+ }
263+
264+ datas = append (datas , data )
265+ }
266+
267+ assert .Equal (t , 2 , len (datas ))
268+ }
0 commit comments