@@ -40,6 +40,9 @@ package tests
40
40
41
41
import (
42
42
"fmt"
43
+ "log"
44
+ "os"
45
+ "sync"
43
46
"testing"
44
47
45
48
"gorm.io/gorm"
@@ -65,3 +68,91 @@ func TestWithSingleConnection(t *testing.T) {
65
68
t .Errorf ("WithSingleConnection() method should get correct value, expect: %v, got %v" , expectedString , actualString )
66
69
}
67
70
}
71
+
72
+ func TestConnectionWithInvalidQuery (t * testing.T ) {
73
+ err := DB .Connection (func (tx * gorm.DB ) error {
74
+ return tx .Exec ("SELECT * FROM non_existent_table" ).Error
75
+ })
76
+ if err == nil {
77
+ t .Fatalf ("Expected error for invalid query in Connection, got nil" )
78
+ }
79
+ }
80
+
81
+ func TestMultipleSequentialConnections (t * testing.T ) {
82
+ for i := 0 ; i < 20 ; i ++ {
83
+ var val int
84
+ err := DB .Connection (func (tx * gorm.DB ) error {
85
+ return tx .Raw ("SELECT 1 FROM dual" ).Scan (& val ).Error
86
+ })
87
+ if err != nil {
88
+ t .Fatalf ("Sequential Connection #%d failed: %v" , i + 1 , err )
89
+ }
90
+ if val != 1 {
91
+ t .Fatalf ("Sequential Connection #%d got wrong result: %v" , i + 1 , val )
92
+ }
93
+ }
94
+ }
95
+
96
+ func TestConnectionAfterDBClose (t * testing.T ) {
97
+ sqlDB , err := DB .DB ()
98
+ if err != nil {
99
+ t .Fatalf ("DB.DB() should not fail, got: %v" , err )
100
+ }
101
+ err = sqlDB .Close ()
102
+ if err != nil {
103
+ t .Fatalf ("sqlDB.Close() failed: %v" , err )
104
+ }
105
+ cerr := DB .Connection (func (tx * gorm.DB ) error {
106
+ var v int
107
+ return tx .Raw ("SELECT 1 FROM dual" ).Scan (& v ).Error
108
+ })
109
+ if cerr == nil {
110
+ t .Fatalf ("Expected error when calling Connection after DB closed, got nil" )
111
+ }
112
+ if DB , err = OpenTestConnection (& gorm.Config {Logger : newLogger }); err != nil {
113
+ log .Printf ("failed to connect database, got error %v" , err )
114
+ os .Exit (1 )
115
+ }
116
+ }
117
+
118
+ func TestConnectionHandlesPanic (t * testing.T ) {
119
+ defer func () {
120
+ if r := recover (); r == nil {
121
+ t .Fatalf ("Expected panic inside Connection, but none occurred" )
122
+ }
123
+ }()
124
+ DB .Connection (func (tx * gorm.DB ) error {
125
+ panic ("panic in connection callback" )
126
+ })
127
+ t .Fatalf ("Should have panicked inside connection callback" )
128
+ }
129
+
130
+ func TestConcurrentConnections (t * testing.T ) {
131
+ const goroutines = 10
132
+ var wg sync.WaitGroup
133
+ wg .Add (goroutines )
134
+ errChan := make (chan error , goroutines )
135
+
136
+ for i := 0 ; i < goroutines ; i ++ {
137
+ go func (i int ) {
138
+ defer wg .Done ()
139
+ var val int
140
+ err := DB .Connection (func (tx * gorm.DB ) error {
141
+ return tx .Raw ("SELECT ? FROM dual" , i ).Scan (& val ).Error
142
+ })
143
+ if err != nil {
144
+ errChan <- fmt .Errorf ("goroutine #%d: connection err: %v" , i , err )
145
+ return
146
+ }
147
+ if val != i {
148
+ errChan <- fmt .Errorf ("goroutine #%d: got wrong result: %v" , i , val )
149
+ }
150
+ }(i )
151
+ }
152
+
153
+ wg .Wait ()
154
+ close (errChan )
155
+ for err := range errChan {
156
+ t .Error (err )
157
+ }
158
+ }
0 commit comments