ducky/subscriptions

Paddy 2015-06-11 Child:f1a22fc2321d

0:56a2bef197cd Go to Latest

ducky/subscriptions/subscription_store_test.go

First implementation of datastore interface. Define Subscriptions, and the SubscriptionChange type that can modify Subscriptions. Define the subscriptionStore, which describes how Subscriptions are to be created, retrieved, updated, and deleted in/from the storage backend they're stored in. Create a Memstore implementation of the subscriptionStore, which stores all our data in-memory, for use in testing. Write tests to cover the subscriptionStore interface, testing the entire Memstore. We'll plug future storage backends into these tests, to make sure they all behave the same, and to exercise each storage backend without requiring a suite of tests for each. At this point, we have 100% test coverage and no complaints from golint or go vet. I expect it's all downhill from here.

History
paddy@0 1 package subscriptions
paddy@0 2
paddy@0 3 import (
paddy@0 4 "strconv"
paddy@0 5 "testing"
paddy@0 6 "time"
paddy@0 7
paddy@0 8 "code.secondbit.org/uuid.hg"
paddy@0 9 )
paddy@0 10
paddy@0 11 const (
paddy@0 12 subscriptionChangeStripeCustomer = 1 << iota
paddy@0 13 subscriptionChangeAmount
paddy@0 14 subscriptionChangePeriod
paddy@0 15 subscriptionChangeBeginCharging
paddy@0 16 subscriptionChangeLastCharged
paddy@0 17 subscriptionChangeLastNotified
paddy@0 18 subscriptionChangeInLockout
paddy@0 19 )
paddy@0 20
paddy@0 21 var testSubscriptionStores = []subscriptionStore{
paddy@0 22 NewMemstore(),
paddy@0 23 }
paddy@0 24
paddy@0 25 func compareSubscriptions(sub1, sub2 Subscription) (bool, string, interface{}, interface{}) {
paddy@0 26 if !sub1.ID.Equal(sub2.ID) {
paddy@0 27 return false, "ID", sub1.ID, sub2.ID
paddy@0 28 }
paddy@0 29 if !sub1.UserID.Equal(sub2.UserID) {
paddy@0 30 return false, "UserID", sub1.UserID, sub2.UserID
paddy@0 31 }
paddy@0 32 if sub1.StripeCustomer != sub2.StripeCustomer {
paddy@0 33 return false, "StripeCustomer", sub1.StripeCustomer, sub2.StripeCustomer
paddy@0 34 }
paddy@0 35 if sub1.Amount != sub2.Amount {
paddy@0 36 return false, "Amount", sub1.Amount, sub2.Amount
paddy@0 37 }
paddy@0 38 if sub1.Period != sub2.Period {
paddy@0 39 return false, "Period", sub1.Period, sub2.Period
paddy@0 40 }
paddy@0 41 if !sub1.Created.Equal(sub2.Created) {
paddy@0 42 return false, "Created", sub1.Created, sub2.Created
paddy@0 43 }
paddy@0 44 if !sub1.BeginCharging.Equal(sub2.BeginCharging) {
paddy@0 45 return false, "BeginCharging", sub1.BeginCharging, sub2.BeginCharging
paddy@0 46 }
paddy@0 47 if !sub1.LastCharged.Equal(sub2.LastCharged) {
paddy@0 48 return false, "LastCharged", sub1.LastCharged, sub2.LastCharged
paddy@0 49 }
paddy@0 50 if !sub1.LastNotified.Equal(sub2.LastNotified) {
paddy@0 51 return false, "LastNotified", sub1.LastNotified, sub2.LastNotified
paddy@0 52 }
paddy@0 53 if sub1.InLockout != sub2.InLockout {
paddy@0 54 return false, "InLockout", sub1.InLockout, sub2.InLockout
paddy@0 55 }
paddy@0 56 return true, "", nil, nil
paddy@0 57 }
paddy@0 58
paddy@0 59 func subscriptionMapContains(subscriptionMap map[string]Subscription, subscriptions ...Subscription) (bool, []Subscription) {
paddy@0 60 var missing []Subscription
paddy@0 61 for _, sub := range subscriptions {
paddy@0 62 if _, ok := subscriptionMap[sub.ID.String()]; !ok {
paddy@0 63 missing = append(missing, sub)
paddy@0 64 }
paddy@0 65 }
paddy@0 66 if len(missing) > 0 {
paddy@0 67 return false, missing
paddy@0 68 }
paddy@0 69 return true, missing
paddy@0 70 }
paddy@0 71
paddy@0 72 func TestCreateSubscription(t *testing.T) {
paddy@0 73 for _, store := range testSubscriptionStores {
paddy@0 74 err := store.reset()
paddy@0 75 if err != nil {
paddy@0 76 t.Fatalf("Error resetting %T: %+v\n", store, err)
paddy@0 77 }
paddy@0 78 customerID := uuid.NewID()
paddy@0 79 sub := Subscription{
paddy@0 80 ID: uuid.NewID(),
paddy@0 81 UserID: customerID,
paddy@0 82 StripeCustomer: "stripeCustomer1",
paddy@0 83 Amount: 200,
paddy@0 84 Period: MonthlyPeriod,
paddy@0 85 Created: time.Now(),
paddy@0 86 BeginCharging: time.Now().Add(time.Hour),
paddy@0 87 }
paddy@0 88 err = store.createSubscription(sub)
paddy@0 89 if err != nil {
paddy@0 90 t.Errorf("Error creating subscription in %T: %+v\n", store, err)
paddy@0 91 }
paddy@0 92 retrieved, err := store.getSubscriptions([]uuid.ID{sub.ID})
paddy@0 93 if err != nil {
paddy@0 94 t.Errorf("Error retrieving subscription from %T: %+v\n", store, err)
paddy@0 95 }
paddy@0 96 if _, returned := retrieved[sub.ID.String()]; !returned {
paddy@0 97 t.Errorf("Error retrieving subscription from %T: %s wasn't in the results.", store, sub.ID)
paddy@0 98 }
paddy@0 99 ok, field, expected, result := compareSubscriptions(sub, retrieved[sub.ID.String()])
paddy@0 100 if !ok {
paddy@0 101 t.Errorf("Expected %s to be %v, got %v from %T\n", field, expected, result, store)
paddy@0 102 }
paddy@0 103 err = store.createSubscription(sub)
paddy@0 104 if err != ErrSubscriptionAlreadyExists {
paddy@0 105 t.Errorf("Unexpected error creating subscription in %T (wanted %+v): %+v\n", store, ErrSubscriptionAlreadyExists, err)
paddy@0 106 }
paddy@0 107 sub.ID = uuid.NewID()
paddy@0 108 err = store.createSubscription(sub)
paddy@0 109 if err != ErrStripeCustomerAlreadyExists {
paddy@0 110 t.Errorf("Unexpected error creating subscription in %T (wanted %+v): %+v\n", store, ErrStripeCustomerAlreadyExists, err)
paddy@0 111 }
paddy@0 112 sub.StripeCustomer = "stripeCustomer2"
paddy@0 113 err = store.createSubscription(sub)
paddy@0 114 if err != nil {
paddy@0 115 t.Errorf("Error creating subscription in %T: %+v\n", store, err)
paddy@0 116 }
paddy@0 117 }
paddy@0 118 }
paddy@0 119
paddy@0 120 func TestUpdateSubscription(t *testing.T) {
paddy@0 121 variations := 1 << 7
paddy@0 122 sub := Subscription{
paddy@0 123 ID: uuid.NewID(),
paddy@0 124 UserID: uuid.NewID(),
paddy@0 125 StripeCustomer: "default",
paddy@0 126 Amount: -1,
paddy@0 127 Period: MonthlyPeriod,
paddy@0 128 Created: time.Now().Add(time.Hour * -24),
paddy@0 129 BeginCharging: time.Now().Add(time.Hour * -24),
paddy@0 130 LastCharged: time.Now().Add(time.Hour * -24),
paddy@0 131 LastNotified: time.Now().Add(time.Hour * -24),
paddy@0 132 InLockout: true,
paddy@0 133 }
paddy@0 134 sub2 := Subscription{
paddy@0 135 ID: uuid.NewID(),
paddy@0 136 UserID: uuid.NewID(),
paddy@0 137 StripeCustomer: "stripeCustomer2",
paddy@0 138 Amount: -2,
paddy@0 139 Period: MonthlyPeriod,
paddy@0 140 Created: time.Now(),
paddy@0 141 BeginCharging: time.Now(),
paddy@0 142 LastCharged: time.Now(),
paddy@0 143 LastNotified: time.Now(),
paddy@0 144 InLockout: false,
paddy@0 145 }
paddy@0 146
paddy@0 147 for i := 1; i < variations; i++ {
paddy@0 148 var stripeCustomer string
paddy@0 149 var amount int
paddy@0 150 var inLockout bool
paddy@0 151 var per period
paddy@0 152 var beginCharging, lastCharged, lastNotified time.Time
paddy@0 153
paddy@0 154 change := SubscriptionChange{}
paddy@0 155 empty := change.IsEmpty()
paddy@0 156 if !empty {
paddy@0 157 t.Errorf("Expected empty to be %t, was %t\n", true, empty)
paddy@0 158 }
paddy@0 159 expectation := sub
paddy@0 160 result := sub
paddy@0 161 strI := strconv.Itoa(i)
paddy@0 162
paddy@0 163 if i&subscriptionChangeStripeCustomer != 0 {
paddy@0 164 stripeCustomer = "stripeCustomer-" + strI
paddy@0 165 change.StripeCustomer = &stripeCustomer
paddy@0 166 expectation.StripeCustomer = stripeCustomer
paddy@0 167 }
paddy@0 168
paddy@0 169 if i&subscriptionChangeAmount != 0 {
paddy@0 170 amount = i
paddy@0 171 change.Amount = &amount
paddy@0 172 expectation.Amount = amount
paddy@0 173 }
paddy@0 174
paddy@0 175 if i&subscriptionChangePeriod != 0 {
paddy@0 176 per = period("period-" + strI)
paddy@0 177 change.Period = &per
paddy@0 178 expectation.Period = per
paddy@0 179 }
paddy@0 180
paddy@0 181 if i&subscriptionChangeBeginCharging != 0 {
paddy@0 182 beginCharging = time.Now().Add(time.Hour * time.Duration(i))
paddy@0 183 change.BeginCharging = &beginCharging
paddy@0 184 expectation.BeginCharging = beginCharging
paddy@0 185 }
paddy@0 186
paddy@0 187 if i&subscriptionChangeLastCharged != 0 {
paddy@0 188 lastCharged = time.Now().Add(time.Hour * time.Duration(i))
paddy@0 189 change.LastCharged = &lastCharged
paddy@0 190 expectation.LastCharged = lastCharged
paddy@0 191 }
paddy@0 192
paddy@0 193 if i&subscriptionChangeLastNotified != 0 {
paddy@0 194 lastNotified = time.Now().Add(time.Hour * time.Duration(i))
paddy@0 195 change.LastNotified = &lastNotified
paddy@0 196 expectation.LastNotified = lastNotified
paddy@0 197 }
paddy@0 198
paddy@0 199 if i&subscriptionChangeInLockout != 0 {
paddy@0 200 inLockout = i%2 == 0
paddy@0 201 change.InLockout = &inLockout
paddy@0 202 expectation.InLockout = inLockout
paddy@0 203 }
paddy@0 204
paddy@0 205 empty = change.IsEmpty()
paddy@0 206 if empty {
paddy@0 207 t.Errorf("Expected empty to be %t, was %t\n", false, empty)
paddy@0 208 }
paddy@0 209
paddy@0 210 result.ApplyChange(change)
paddy@0 211 match, field, expected, got := compareSubscriptions(expectation, result)
paddy@0 212 if !match {
paddy@0 213 t.Errorf("Expected field `%s` to be `%v`, got `%v`\n", field, expected, got)
paddy@0 214 }
paddy@0 215 for _, store := range testSubscriptionStores {
paddy@0 216 err := store.reset()
paddy@0 217 if err != nil {
paddy@0 218 t.Fatalf("Error resetting %T: %+v\n", store, err)
paddy@0 219 }
paddy@0 220 err = store.createSubscription(sub)
paddy@0 221 if err != nil {
paddy@0 222 t.Fatalf("Error saving subscription in %T: %s\n", store, err)
paddy@0 223 }
paddy@0 224 err = store.updateSubscription(sub.ID, change)
paddy@0 225 if err != nil {
paddy@0 226 t.Errorf("Error updating subscription in %T: %s\n", store, err)
paddy@0 227 }
paddy@0 228 retrieved, err := store.getSubscriptions([]uuid.ID{sub.ID})
paddy@0 229 if err != nil {
paddy@0 230 t.Errorf("Error getting subscription from %T: %s\n", store, err)
paddy@0 231 }
paddy@0 232 ok, missing := subscriptionMapContains(retrieved, sub)
paddy@0 233 if !ok {
paddy@0 234 t.Errorf("Expected to retrieve %s from %T, but missing was %+v\n", sub.ID.String(), store, missing)
paddy@0 235 }
paddy@0 236 match, field, expected, got = compareSubscriptions(expectation, retrieved[sub.ID.String()])
paddy@0 237 if !match {
paddy@0 238 t.Errorf("Expected field `%s` to be `%v`, got `%v` from %T\n", field, expected, got, store)
paddy@0 239 }
paddy@0 240 }
paddy@0 241 }
paddy@0 242 for _, store := range testSubscriptionStores {
paddy@0 243 err := store.reset()
paddy@0 244 if err != nil {
paddy@0 245 t.Fatalf("Error resetting %T: %+v\n", store, err)
paddy@0 246 }
paddy@0 247 err = store.createSubscription(sub)
paddy@0 248 if err != nil {
paddy@0 249 t.Fatalf("Error saving subscription in %T: %+v\n", store, err)
paddy@0 250 }
paddy@0 251 err = store.createSubscription(sub2)
paddy@0 252 if err != nil {
paddy@0 253 t.Fatalf("Error saving subscription in %T: %+v\n", store, err)
paddy@0 254 }
paddy@0 255 change := SubscriptionChange{}
paddy@0 256 err = store.updateSubscription(sub.ID, change)
paddy@0 257 if err != ErrSubscriptionChangeEmpty {
paddy@0 258 t.Errorf("Expected err to be %+v, but got %+v from %T\n", ErrSubscriptionChangeEmpty, err, store)
paddy@0 259 }
paddy@0 260 stripeCustomer := sub2.StripeCustomer
paddy@0 261 change.StripeCustomer = &stripeCustomer
paddy@0 262 err = store.updateSubscription(uuid.NewID(), change)
paddy@0 263 if err != ErrSubscriptionNotFound {
paddy@0 264 t.Errorf("Expected err to be %+v, but got %+v from %T\n", ErrSubscriptionNotFound, err, store)
paddy@0 265 }
paddy@0 266 err = store.updateSubscription(sub.ID, change)
paddy@0 267 if err != ErrStripeCustomerAlreadyExists {
paddy@0 268 t.Errorf("Expected err to be %+v, but got %+v from %T\n", ErrStripeCustomerAlreadyExists, err, store)
paddy@0 269 }
paddy@0 270 }
paddy@0 271 }
paddy@0 272
paddy@0 273 func TestDeleteSubscription(t *testing.T) {
paddy@0 274 for _, store := range testSubscriptionStores {
paddy@0 275 err := store.reset()
paddy@0 276 if err != nil {
paddy@0 277 t.Fatalf("Error resetting %T: %+v\n", store, err)
paddy@0 278 }
paddy@0 279 sub1 := Subscription{
paddy@0 280 ID: uuid.NewID(),
paddy@0 281 UserID: uuid.NewID(),
paddy@0 282 StripeCustomer: "stripeCustomer1",
paddy@0 283 }
paddy@0 284 sub2 := Subscription{
paddy@0 285 ID: uuid.NewID(),
paddy@0 286 UserID: uuid.NewID(),
paddy@0 287 StripeCustomer: "stripeCustomer2",
paddy@0 288 }
paddy@0 289 err = store.createSubscription(sub1)
paddy@0 290 if err != nil {
paddy@0 291 t.Fatalf("Error creating %+v in %T: %+v\n", sub1, store, err)
paddy@0 292 }
paddy@0 293 err = store.createSubscription(sub2)
paddy@0 294 if err != nil {
paddy@0 295 t.Fatalf("Error creating %+v in %T: %+v\n", sub1, store, err)
paddy@0 296 }
paddy@0 297 err = store.deleteSubscription(sub1.ID)
paddy@0 298 if err != nil {
paddy@0 299 t.Fatalf("Error deleting %+v in %T: %+v\n", sub1, store, err)
paddy@0 300 }
paddy@0 301 retrieved, err := store.getSubscriptions([]uuid.ID{sub1.ID, sub2.ID})
paddy@0 302 if err != nil {
paddy@0 303 t.Errorf("Error retrieving subscriptions from %T: %+v\n", store, err)
paddy@0 304 }
paddy@0 305 ok, missing := subscriptionMapContains(retrieved, sub1)
paddy@0 306 if ok {
paddy@0 307 t.Errorf("Expected not to retrieve %s from %T, but missing was %+v\n", sub1.ID.String(), store, missing)
paddy@0 308 }
paddy@0 309 ok, missing = subscriptionMapContains(retrieved, sub2)
paddy@0 310 if !ok {
paddy@0 311 t.Errorf("Expected to retrieve %s from %T, but missing was %+v\n", sub2.ID.String(), store, missing)
paddy@0 312 }
paddy@0 313 _, err = store.getSubscriptionByUser(sub1.UserID)
paddy@0 314 if err != ErrSubscriptionNotFound {
paddy@0 315 t.Errorf("Expected err to be %+v, but got %+v from %T\n", ErrSubscriptionNotFound, err, store)
paddy@0 316 }
paddy@0 317 err = store.deleteSubscription(sub1.ID)
paddy@0 318 if err != ErrSubscriptionNotFound {
paddy@0 319 t.Errorf("Expected err to be %+v, but got %+v from %T\n", ErrSubscriptionNotFound, err, store)
paddy@0 320 }
paddy@0 321 }
paddy@0 322 }
paddy@0 323
paddy@0 324 func TestListSubscriptionsLastChargedBefore(t *testing.T) {
paddy@0 325 for _, store := range testSubscriptionStores {
paddy@0 326 err := store.reset()
paddy@0 327 if err != nil {
paddy@0 328 t.Fatalf("Error resetting %T: %+v\n", store, err)
paddy@0 329 }
paddy@0 330 sub1 := Subscription{
paddy@0 331 ID: uuid.NewID(),
paddy@0 332 UserID: uuid.NewID(),
paddy@0 333 StripeCustomer: "stripeCustomer1",
paddy@0 334 Amount: 200,
paddy@0 335 Period: MonthlyPeriod,
paddy@0 336 Created: time.Now().Add(time.Hour * -24 * 32),
paddy@0 337 BeginCharging: time.Now().Add(time.Hour * -24),
paddy@0 338 LastCharged: time.Now().Add(time.Hour * -24),
paddy@0 339 }
paddy@0 340 sub2 := Subscription{
paddy@0 341 ID: uuid.NewID(),
paddy@0 342 UserID: uuid.NewID(),
paddy@0 343 StripeCustomer: "stripeCustomer2",
paddy@0 344 Amount: 300,
paddy@0 345 Period: MonthlyPeriod,
paddy@0 346 Created: time.Now().Add(time.Hour * -24 * 61),
paddy@0 347 BeginCharging: time.Now().Add(time.Hour * -24 * 31),
paddy@0 348 LastCharged: time.Now().Add(time.Hour * -24 * 31),
paddy@0 349 }
paddy@0 350 sub3 := Subscription{
paddy@0 351 ID: uuid.NewID(),
paddy@0 352 UserID: uuid.NewID(),
paddy@0 353 StripeCustomer: "stripeCustomer3",
paddy@0 354 Amount: 100,
paddy@0 355 Period: MonthlyPeriod,
paddy@0 356 Created: time.Now().Add(time.Hour * -1),
paddy@0 357 BeginCharging: time.Now().Add(time.Hour * 31),
paddy@0 358 LastCharged: time.Time{},
paddy@0 359 }
paddy@0 360 err = store.createSubscription(sub1)
paddy@0 361 if err != nil {
paddy@0 362 t.Fatalf("Error creating %+v in %T: %+v\n", sub1, store, err)
paddy@0 363 }
paddy@0 364 err = store.createSubscription(sub2)
paddy@0 365 if err != nil {
paddy@0 366 t.Fatalf("Error creating %+v in %T: %+v\n", sub1, store, err)
paddy@0 367 }
paddy@0 368 err = store.createSubscription(sub3)
paddy@0 369 if err != nil {
paddy@0 370 t.Fatalf("Error creating %+v in %T: %+v\n", sub1, store, err)
paddy@0 371 }
paddy@0 372 t.Logf("sub1: %+v\n", sub1)
paddy@0 373 t.Logf("sub2: %+v\n", sub2)
paddy@0 374 t.Logf("sub3: %+v\n", sub3)
paddy@0 375 // subscriptions last charged before right now
paddy@0 376 // should be sub1, sub2, and sub3
paddy@0 377 results, err := store.listSubscriptionsLastChargedBefore(time.Now())
paddy@0 378 if err != nil {
paddy@0 379 t.Errorf("Unexpected error listing subscriptions in %T: %+v\n", store, err)
paddy@0 380 }
paddy@0 381 if len(results) != 3 {
paddy@0 382 t.Errorf("Expected three results from %T, got %+v\n", store, results)
paddy@0 383 }
paddy@0 384 ok, field, expected, result := compareSubscriptions(sub3, results[0])
paddy@0 385 if !ok {
paddy@0 386 t.Errorf("Expected %s in pos 0 to be %+v, got %+v from %T", field, expected, result, store)
paddy@0 387 }
paddy@0 388 ok, field, expected, result = compareSubscriptions(sub2, results[1])
paddy@0 389 if !ok {
paddy@0 390 t.Errorf("Expected %s in pos 1 to be %+v, got %+v from %T", field, expected, result, store)
paddy@0 391 }
paddy@0 392 ok, field, expected, result = compareSubscriptions(sub1, results[2])
paddy@0 393 if !ok {
paddy@0 394 t.Errorf("Expected %s in pos 2 to be %+v, got %+v from %T", field, expected, result, store)
paddy@0 395 }
paddy@0 396 // subscriptions last charged before a week ago
paddy@0 397 // should be sub2, sub3
paddy@0 398 results, err = store.listSubscriptionsLastChargedBefore(time.Now().Add(time.Hour * -24 * 7))
paddy@0 399 if err != nil {
paddy@0 400 t.Errorf("Unexpected error listing subscriptions in %T: %+v\n", store, err)
paddy@0 401 }
paddy@0 402 if len(results) != 2 {
paddy@0 403 t.Errorf("Expected two results from %T, got %+v\n", store, results)
paddy@0 404 }
paddy@0 405 ok, field, expected, result = compareSubscriptions(sub3, results[0])
paddy@0 406 if !ok {
paddy@0 407 t.Errorf("Expected %s in pos 0 to be %+v, got %+v from %T", field, expected, result, store)
paddy@0 408 }
paddy@0 409 ok, field, expected, result = compareSubscriptions(sub2, results[1])
paddy@0 410 if !ok {
paddy@0 411 t.Errorf("Expected %s in pos 1 to be %+v, got %+v from %T", field, expected, result, store)
paddy@0 412 }
paddy@0 413 // subscriptions last charged before 32 days ago
paddy@0 414 // should be sub3
paddy@0 415 results, err = store.listSubscriptionsLastChargedBefore(time.Now().Add(time.Hour * -24 * 32))
paddy@0 416 if err != nil {
paddy@0 417 t.Errorf("Unexpected error listing subscriptions in %T: %+v\n", store, err)
paddy@0 418 }
paddy@0 419 if len(results) != 1 {
paddy@0 420 t.Errorf("Expected one result from %T, got %+v\n", store, results)
paddy@0 421 }
paddy@0 422 ok, field, expected, result = compareSubscriptions(sub3, results[0])
paddy@0 423 if !ok {
paddy@0 424 t.Errorf("Expected %s in pos 0 to be %+v, got %+v from %T", field, expected, result, store)
paddy@0 425 }
paddy@0 426 }
paddy@0 427 }
paddy@0 428
paddy@0 429 func TestGetSubscriptions(t *testing.T) {
paddy@0 430 for _, store := range testSubscriptionStores {
paddy@0 431 err := store.reset()
paddy@0 432 if err != nil {
paddy@0 433 t.Fatalf("Error resetting %T: %+v\n", store, err)
paddy@0 434 }
paddy@0 435 sub1 := Subscription{
paddy@0 436 ID: uuid.NewID(),
paddy@0 437 UserID: uuid.NewID(),
paddy@0 438 StripeCustomer: "stripeCustomer1",
paddy@0 439 Amount: 200,
paddy@0 440 Period: MonthlyPeriod,
paddy@0 441 Created: time.Now(),
paddy@0 442 BeginCharging: time.Now().Add(time.Hour),
paddy@0 443 }
paddy@0 444 sub2 := Subscription{
paddy@0 445 ID: uuid.NewID(),
paddy@0 446 UserID: uuid.NewID(),
paddy@0 447 StripeCustomer: "stripeCustomer2",
paddy@0 448 Amount: 300,
paddy@0 449 Period: MonthlyPeriod,
paddy@0 450 Created: time.Now().Add(time.Hour * -720),
paddy@0 451 BeginCharging: time.Now().Add(time.Hour*-720 + time.Hour*2),
paddy@0 452 LastCharged: time.Now(),
paddy@0 453 }
paddy@0 454 sub3 := Subscription{
paddy@0 455 ID: uuid.NewID(),
paddy@0 456 UserID: uuid.NewID(),
paddy@0 457 StripeCustomer: "stripeCustomer3",
paddy@0 458 Amount: 100,
paddy@0 459 Period: MonthlyPeriod,
paddy@0 460 Created: time.Now().Add(time.Hour * -1440),
paddy@0 461 BeginCharging: time.Now().Add(time.Hour * -1440),
paddy@0 462 LastNotified: time.Now().Add(time.Hour * -720),
paddy@0 463 InLockout: true,
paddy@0 464 }
paddy@0 465 err = store.createSubscription(sub1)
paddy@0 466 if err != nil {
paddy@0 467 t.Fatalf("Error creating %+v in %T: %+v\n", sub1, store, err)
paddy@0 468 }
paddy@0 469 err = store.createSubscription(sub2)
paddy@0 470 if err != nil {
paddy@0 471 t.Fatalf("Error creating %+v in %T: %+v\n", sub1, store, err)
paddy@0 472 }
paddy@0 473 err = store.createSubscription(sub3)
paddy@0 474 if err != nil {
paddy@0 475 t.Fatalf("Error creating %+v in %T: %+v\n", sub1, store, err)
paddy@0 476 }
paddy@0 477 retrieved, err := store.getSubscriptions([]uuid.ID{})
paddy@0 478 if err != ErrNoSubscriptionID {
paddy@0 479 t.Errorf("Error retrieving no subscriptions from %T. Expected %+v, got %+v\n", store, ErrNoSubscriptionID, err)
paddy@0 480 }
paddy@0 481 retrieved, err = store.getSubscriptions([]uuid.ID{sub1.ID})
paddy@0 482 if err != nil {
paddy@0 483 t.Errorf("Error retrieving %s from %T: %+v\n", sub1.ID, store, err)
paddy@0 484 }
paddy@0 485 ok, missing := subscriptionMapContains(retrieved, sub1)
paddy@0 486 if !ok {
paddy@0 487 t.Logf("Results: %+v\n", retrieved)
paddy@0 488 t.Errorf("Expected %+v to be in the results, was not for %T.\n", missing, store)
paddy@0 489 }
paddy@0 490 retrieved, err = store.getSubscriptions([]uuid.ID{sub1.ID, sub2.ID})
paddy@0 491 if err != nil {
paddy@0 492 t.Errorf("Error retrieving %s and %s from %T: %+v\n", sub1.ID, sub2.ID, store, err)
paddy@0 493 }
paddy@0 494 ok, missing = subscriptionMapContains(retrieved, sub1, sub2)
paddy@0 495 if !ok {
paddy@0 496 t.Logf("Results: %+v\n", retrieved)
paddy@0 497 t.Errorf("Expected %+v to be in the results, was not for %T.\n", missing, store)
paddy@0 498 }
paddy@0 499 retrieved, err = store.getSubscriptions([]uuid.ID{sub1.ID, sub3.ID})
paddy@0 500 if err != nil {
paddy@0 501 t.Errorf("Error retrieving %s and %s from %T: %+v\n", sub1.ID, sub3.ID, store, err)
paddy@0 502 }
paddy@0 503 ok, missing = subscriptionMapContains(retrieved, sub1, sub3)
paddy@0 504 if !ok {
paddy@0 505 t.Logf("Results: %+v\n", retrieved)
paddy@0 506 t.Errorf("Expected %+v to be in the results, was not for %T.\n", missing, store)
paddy@0 507 }
paddy@0 508 retrieved, err = store.getSubscriptions([]uuid.ID{sub1.ID, sub2.ID, sub3.ID})
paddy@0 509 if err != nil {
paddy@0 510 t.Errorf("Error retrieving %s, %s, and %s from %T: %+v\n", sub1.ID, sub2.ID, sub3.ID, store, err)
paddy@0 511 }
paddy@0 512 ok, missing = subscriptionMapContains(retrieved, sub1, sub2, sub3)
paddy@0 513 if !ok {
paddy@0 514 t.Logf("Results: %+v\n", retrieved)
paddy@0 515 t.Errorf("Expected %+v to be in the results, was not for %T.\n", missing, store)
paddy@0 516 }
paddy@0 517 retrieved, err = store.getSubscriptions([]uuid.ID{sub2.ID})
paddy@0 518 if err != nil {
paddy@0 519 t.Errorf("Error retrieving %s from %T: %+v\n", sub2.ID, store, err)
paddy@0 520 }
paddy@0 521 ok, missing = subscriptionMapContains(retrieved, sub2)
paddy@0 522 if !ok {
paddy@0 523 t.Logf("Results: %+v\n", retrieved)
paddy@0 524 t.Errorf("Expected %+v to be in the results, was not for %T.\n", missing, store)
paddy@0 525 }
paddy@0 526 retrieved, err = store.getSubscriptions([]uuid.ID{sub2.ID, sub3.ID})
paddy@0 527 if err != nil {
paddy@0 528 t.Errorf("Error retrieving %s and %s from %T: %+v\n", sub2.ID, sub3.ID, store, err)
paddy@0 529 }
paddy@0 530 ok, missing = subscriptionMapContains(retrieved, sub2, sub3)
paddy@0 531 if !ok {
paddy@0 532 t.Logf("Results: %+v\n", retrieved)
paddy@0 533 t.Errorf("Expected %+v to be in the results, was not for %T.\n", missing, store)
paddy@0 534 }
paddy@0 535 retrieved, err = store.getSubscriptions([]uuid.ID{sub3.ID})
paddy@0 536 if err != nil {
paddy@0 537 t.Errorf("Error retrieving %s from %T: %+v\n", sub3.ID, store, err)
paddy@0 538 }
paddy@0 539 ok, missing = subscriptionMapContains(retrieved, sub3)
paddy@0 540 if !ok {
paddy@0 541 t.Logf("Results: %+v\n", retrieved)
paddy@0 542 t.Errorf("Expected %+v to be in the results, was not for %T.\n", missing, store)
paddy@0 543 }
paddy@0 544 retrieved, err = store.getSubscriptions([]uuid.ID{uuid.NewID()})
paddy@0 545 if err != nil {
paddy@0 546 t.Errorf("Error retrieving non-existent ID from %T: %+v\n", store, err)
paddy@0 547 }
paddy@0 548 if len(retrieved) != 0 {
paddy@0 549 t.Errorf("Expected no results, %T returned %+v\n", store, retrieved)
paddy@0 550 }
paddy@0 551 retrieved, err = store.getSubscriptions([]uuid.ID{sub1.ID, sub2.ID, uuid.NewID(), sub3.ID})
paddy@0 552 if err != nil {
paddy@0 553 t.Errorf("Error retrieving non-existent ID from %T: %+v\n", store, err)
paddy@0 554 }
paddy@0 555 if len(retrieved) != 3 {
paddy@0 556 t.Errorf("Expected 3 results, %T returned %+v\n", store, retrieved)
paddy@0 557 }
paddy@0 558 ok, missing = subscriptionMapContains(retrieved, sub1, sub2, sub3)
paddy@0 559 if !ok {
paddy@0 560 t.Logf("Results: %+v\n", retrieved)
paddy@0 561 t.Errorf("Expected %+v to be in the results, was not for %T.\n", missing, store)
paddy@0 562 }
paddy@0 563 }
paddy@0 564 }
paddy@0 565
paddy@0 566 func TestGetSubscriptionByUser(t *testing.T) {
paddy@0 567 for _, store := range testSubscriptionStores {
paddy@0 568 err := store.reset()
paddy@0 569 if err != nil {
paddy@0 570 t.Fatalf("Error resetting %T: %+v\n", store, err)
paddy@0 571 }
paddy@0 572 sub1 := Subscription{
paddy@0 573 ID: uuid.NewID(),
paddy@0 574 UserID: uuid.NewID(),
paddy@0 575 StripeCustomer: "stripeCustomer1",
paddy@0 576 }
paddy@0 577 sub2 := Subscription{
paddy@0 578 ID: uuid.NewID(),
paddy@0 579 UserID: uuid.NewID(),
paddy@0 580 StripeCustomer: "stripeCustomer2",
paddy@0 581 }
paddy@0 582 sub3 := Subscription{
paddy@0 583 ID: uuid.NewID(),
paddy@0 584 UserID: uuid.NewID(),
paddy@0 585 StripeCustomer: "stripeCustomer3",
paddy@0 586 }
paddy@0 587 err = store.createSubscription(sub1)
paddy@0 588 if err != nil {
paddy@0 589 t.Fatalf("Error creating %+v in %T: %+v\n", sub1, store, err)
paddy@0 590 }
paddy@0 591 err = store.createSubscription(sub2)
paddy@0 592 if err != nil {
paddy@0 593 t.Fatalf("Error creating %+v in %T: %+v\n", sub1, store, err)
paddy@0 594 }
paddy@0 595 err = store.createSubscription(sub3)
paddy@0 596 if err != nil {
paddy@0 597 t.Fatalf("Error creating %+v in %T: %+v\n", sub1, store, err)
paddy@0 598 }
paddy@0 599 retrieved, err := store.getSubscriptionByUser(sub1.UserID)
paddy@0 600 if err != nil {
paddy@0 601 t.Errorf("Error retrieving subscription %+v from %T: %+v\n", sub1, store, err)
paddy@0 602 }
paddy@0 603 ok, field, expected, result := compareSubscriptions(sub1, retrieved)
paddy@0 604 if !ok {
paddy@0 605 t.Errorf("Expected %s to be %+v, but was %+v in %T\n", field, expected, result, store)
paddy@0 606 }
paddy@0 607 retrieved, err = store.getSubscriptionByUser(sub2.UserID)
paddy@0 608 if err != nil {
paddy@0 609 t.Errorf("Error retrieving subscription %+v from %T: %+v\n", sub2, store, err)
paddy@0 610 }
paddy@0 611 ok, field, expected, result = compareSubscriptions(sub2, retrieved)
paddy@0 612 if !ok {
paddy@0 613 t.Errorf("Expected %s to be %+v, but was %+v in %T\n", field, expected, result, store)
paddy@0 614 }
paddy@0 615 retrieved, err = store.getSubscriptionByUser(sub3.UserID)
paddy@0 616 if err != nil {
paddy@0 617 t.Errorf("Error retrieving subscription %+v from %T: %+v\n", sub3, store, err)
paddy@0 618 }
paddy@0 619 ok, field, expected, result = compareSubscriptions(sub3, retrieved)
paddy@0 620 if !ok {
paddy@0 621 t.Errorf("Expected %s to be %+v, but was %+v in %T\n", field, expected, result, store)
paddy@0 622 }
paddy@0 623 retrieved, err = store.getSubscriptionByUser(uuid.NewID())
paddy@0 624 if err != ErrSubscriptionNotFound {
paddy@0 625 t.Errorf("Expected err to be %+v, got %+v from %T\n", ErrSubscriptionNotFound, err, store)
paddy@0 626 }
paddy@0 627 }
paddy@0 628 }