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  }