github.com/lingyao2333/mo-zero@v1.4.1/core/stores/mongo/iter_test.go (about) 1 package mongo 2 3 import ( 4 "errors" 5 "testing" 6 7 "github.com/globalsign/mgo" 8 "github.com/golang/mock/gomock" 9 "github.com/lingyao2333/mo-zero/core/breaker" 10 "github.com/lingyao2333/mo-zero/core/stringx" 11 "github.com/lingyao2333/mo-zero/core/syncx" 12 "github.com/stretchr/testify/assert" 13 ) 14 15 func TestClosableIter_Close(t *testing.T) { 16 errs := []error{ 17 nil, 18 mgo.ErrNotFound, 19 } 20 21 for _, err := range errs { 22 t.Run(stringx.RandId(), func(t *testing.T) { 23 ctrl := gomock.NewController(t) 24 defer ctrl.Finish() 25 26 cleaned := syncx.NewAtomicBool() 27 iter := NewMockIter(ctrl) 28 iter.EXPECT().Close().Return(err) 29 ci := ClosableIter{ 30 Iter: iter, 31 Cleanup: func() { 32 cleaned.Set(true) 33 }, 34 } 35 assert.Equal(t, err, ci.Close()) 36 assert.True(t, cleaned.True()) 37 }) 38 } 39 } 40 41 func TestPromisedIter_AllAndClose(t *testing.T) { 42 tests := []struct { 43 err error 44 accepted bool 45 reason string 46 }{ 47 { 48 err: nil, 49 accepted: true, 50 reason: "", 51 }, 52 { 53 err: mgo.ErrNotFound, 54 accepted: true, 55 reason: "", 56 }, 57 { 58 err: errors.New("any"), 59 accepted: false, 60 reason: "any", 61 }, 62 } 63 64 for _, test := range tests { 65 t.Run(stringx.RandId(), func(t *testing.T) { 66 ctrl := gomock.NewController(t) 67 defer ctrl.Finish() 68 69 iter := NewMockIter(ctrl) 70 iter.EXPECT().All(gomock.Any()).Return(test.err) 71 promise := new(mockPromise) 72 pi := promisedIter{ 73 Iter: iter, 74 promise: keepablePromise{ 75 promise: promise, 76 log: func(error) {}, 77 }, 78 } 79 assert.Equal(t, test.err, pi.All(nil)) 80 assert.Equal(t, test.accepted, promise.accepted) 81 assert.Equal(t, test.reason, promise.reason) 82 }) 83 } 84 85 for _, test := range tests { 86 t.Run(stringx.RandId(), func(t *testing.T) { 87 ctrl := gomock.NewController(t) 88 defer ctrl.Finish() 89 90 iter := NewMockIter(ctrl) 91 iter.EXPECT().Close().Return(test.err) 92 promise := new(mockPromise) 93 pi := promisedIter{ 94 Iter: iter, 95 promise: keepablePromise{ 96 promise: promise, 97 log: func(error) {}, 98 }, 99 } 100 assert.Equal(t, test.err, pi.Close()) 101 assert.Equal(t, test.accepted, promise.accepted) 102 assert.Equal(t, test.reason, promise.reason) 103 }) 104 } 105 } 106 107 func TestPromisedIter_Err(t *testing.T) { 108 errs := []error{ 109 nil, 110 mgo.ErrNotFound, 111 } 112 113 for _, err := range errs { 114 t.Run(stringx.RandId(), func(t *testing.T) { 115 ctrl := gomock.NewController(t) 116 defer ctrl.Finish() 117 118 iter := NewMockIter(ctrl) 119 iter.EXPECT().Err().Return(err) 120 promise := new(mockPromise) 121 pi := promisedIter{ 122 Iter: iter, 123 promise: keepablePromise{ 124 promise: promise, 125 log: func(error) {}, 126 }, 127 } 128 assert.Equal(t, err, pi.Err()) 129 }) 130 } 131 } 132 133 func TestPromisedIter_For(t *testing.T) { 134 tests := []struct { 135 err error 136 accepted bool 137 reason string 138 }{ 139 { 140 err: nil, 141 accepted: true, 142 reason: "", 143 }, 144 { 145 err: mgo.ErrNotFound, 146 accepted: true, 147 reason: "", 148 }, 149 { 150 err: errors.New("any"), 151 accepted: false, 152 reason: "any", 153 }, 154 } 155 156 for _, test := range tests { 157 t.Run(stringx.RandId(), func(t *testing.T) { 158 ctrl := gomock.NewController(t) 159 defer ctrl.Finish() 160 161 iter := NewMockIter(ctrl) 162 iter.EXPECT().For(gomock.Any(), gomock.Any()).Return(test.err) 163 promise := new(mockPromise) 164 pi := promisedIter{ 165 Iter: iter, 166 promise: keepablePromise{ 167 promise: promise, 168 log: func(error) {}, 169 }, 170 } 171 assert.Equal(t, test.err, pi.For(nil, nil)) 172 assert.Equal(t, test.accepted, promise.accepted) 173 assert.Equal(t, test.reason, promise.reason) 174 }) 175 } 176 } 177 178 func TestRejectedIter_All(t *testing.T) { 179 assert.Equal(t, breaker.ErrServiceUnavailable, new(rejectedIter).All(nil)) 180 } 181 182 func TestRejectedIter_Close(t *testing.T) { 183 assert.Equal(t, breaker.ErrServiceUnavailable, new(rejectedIter).Close()) 184 } 185 186 func TestRejectedIter_Done(t *testing.T) { 187 assert.False(t, new(rejectedIter).Done()) 188 } 189 190 func TestRejectedIter_Err(t *testing.T) { 191 assert.Equal(t, breaker.ErrServiceUnavailable, new(rejectedIter).Err()) 192 } 193 194 func TestRejectedIter_For(t *testing.T) { 195 assert.Equal(t, breaker.ErrServiceUnavailable, new(rejectedIter).For(nil, nil)) 196 } 197 198 func TestRejectedIter_Next(t *testing.T) { 199 assert.False(t, new(rejectedIter).Next(nil)) 200 } 201 202 func TestRejectedIter_State(t *testing.T) { 203 n, raw := new(rejectedIter).State() 204 assert.Equal(t, int64(0), n) 205 assert.Nil(t, raw) 206 } 207 208 func TestRejectedIter_Timeout(t *testing.T) { 209 assert.False(t, new(rejectedIter).Timeout()) 210 } 211 212 func TestIter_Done(t *testing.T) { 213 ctrl := gomock.NewController(t) 214 defer ctrl.Finish() 215 216 iter := NewMockIter(ctrl) 217 iter.EXPECT().Done().Return(true) 218 ci := ClosableIter{ 219 Iter: iter, 220 Cleanup: nil, 221 } 222 assert.True(t, ci.Done()) 223 } 224 225 func TestIter_Next(t *testing.T) { 226 ctrl := gomock.NewController(t) 227 defer ctrl.Finish() 228 229 iter := NewMockIter(ctrl) 230 iter.EXPECT().Next(gomock.Any()).Return(true) 231 ci := ClosableIter{ 232 Iter: iter, 233 Cleanup: nil, 234 } 235 assert.True(t, ci.Next(nil)) 236 } 237 238 func TestIter_State(t *testing.T) { 239 ctrl := gomock.NewController(t) 240 defer ctrl.Finish() 241 242 iter := NewMockIter(ctrl) 243 iter.EXPECT().State().Return(int64(1), nil) 244 ci := ClosableIter{ 245 Iter: iter, 246 Cleanup: nil, 247 } 248 n, raw := ci.State() 249 assert.Equal(t, int64(1), n) 250 assert.Nil(t, raw) 251 } 252 253 func TestIter_Timeout(t *testing.T) { 254 ctrl := gomock.NewController(t) 255 defer ctrl.Finish() 256 257 iter := NewMockIter(ctrl) 258 iter.EXPECT().Timeout().Return(true) 259 ci := ClosableIter{ 260 Iter: iter, 261 Cleanup: nil, 262 } 263 assert.True(t, ci.Timeout()) 264 }