ducky/subscriptions

Paddy 2015-06-22 Parent:61c4ce5850da Child:c4cfceb2f2fb

3:b240b6123548 Go to Latest

ducky/subscriptions/subscription_store_test.go

Export all subscriptionStore methods. We're not going to wrap all our subscriptionStore interactions in a Context type, so we need to expose all the functions so other packages can call them. Also, it's now SubscriptionStore. Also creates a SubscriptionRequest type that is used to create a new Subscription instance, along with a Validate method on it, to detect errors when creating a SubscriptionRequest. Update our CreateSubscription function to be New, and have it take a SubscriptionRequest, a Stripe instance, and a SubscriptionStore as arguments. It'll create the Subscription in the SubscriptionStore, create a customer in Stripe, and create the subscription in Stripe, then associate the Stripe subscription with the created Subscription. Also, fix our StripeSubscriptionChange function to correctly equate a missing/zero Unix timestamp from Stripe with a missing/zero time.Time.

History
     1.1 --- a/subscription_store_test.go	Tue Jun 16 23:09:59 2015 -0400
     1.2 +++ b/subscription_store_test.go	Mon Jun 22 18:34:07 2015 -0400
     1.3 @@ -34,7 +34,7 @@
     1.4  	}
     1.5  }
     1.6  
     1.7 -var testSubscriptionStores = []subscriptionStore{
     1.8 +var testSubscriptionStores = []SubscriptionStore{
     1.9  	NewMemstore(),
    1.10  }
    1.11  
    1.12 @@ -124,7 +124,7 @@
    1.13  
    1.14  func TestCreateSubscription(t *testing.T) {
    1.15  	for _, store := range testSubscriptionStores {
    1.16 -		err := store.reset()
    1.17 +		err := store.Reset()
    1.18  		if err != nil {
    1.19  			t.Fatalf("Error resetting %T: %+v\n", store, err)
    1.20  		}
    1.21 @@ -136,11 +136,11 @@
    1.22  			TrialStart:         time.Now().Round(time.Millisecond),
    1.23  			TrialEnd:           time.Now().Round(time.Millisecond).Add(time.Hour * 24 * 31),
    1.24  		}
    1.25 -		err = store.createSubscription(sub)
    1.26 +		err = store.CreateSubscription(sub)
    1.27  		if err != nil {
    1.28  			t.Errorf("Error creating subscription in %T: %+v\n", store, err)
    1.29  		}
    1.30 -		retrieved, err := store.getSubscriptions([]uuid.ID{sub.UserID})
    1.31 +		retrieved, err := store.GetSubscriptions([]uuid.ID{sub.UserID})
    1.32  		if err != nil {
    1.33  			t.Errorf("Error retrieving subscription from %T: %+v\n", store, err)
    1.34  		}
    1.35 @@ -151,17 +151,17 @@
    1.36  		if !ok {
    1.37  			t.Errorf("Expected %s to be %v, got %v from %T\n", field, expected, result, store)
    1.38  		}
    1.39 -		err = store.createSubscription(sub)
    1.40 +		err = store.CreateSubscription(sub)
    1.41  		if err != ErrSubscriptionAlreadyExists {
    1.42  			t.Errorf("Unexpected error creating subscription in %T (wanted %+v): %+v\n", store, ErrSubscriptionAlreadyExists, err)
    1.43  		}
    1.44  		sub.UserID = uuid.NewID()
    1.45 -		err = store.createSubscription(sub)
    1.46 +		err = store.CreateSubscription(sub)
    1.47  		if err != ErrStripeSubscriptionAlreadyExists {
    1.48  			t.Errorf("Unexpected error creating subscription in %T (wanted %+v): %#+v\n", store, ErrStripeSubscriptionAlreadyExists, err)
    1.49  		}
    1.50  		sub.StripeSubscription = "stripeSubscription2"
    1.51 -		err = store.createSubscription(sub)
    1.52 +		err = store.CreateSubscription(sub)
    1.53  		if err != nil {
    1.54  			t.Errorf("Error creating subscription in %T: %+v\n", store, err)
    1.55  		}
    1.56 @@ -188,11 +188,11 @@
    1.57  	}
    1.58  
    1.59  	for _, store := range testSubscriptionStores {
    1.60 -		err := store.reset()
    1.61 +		err := store.Reset()
    1.62  		if err != nil {
    1.63  			t.Fatalf("Error resetting %T: %+v\n", store, err)
    1.64  		}
    1.65 -		err = store.createSubscription(sub)
    1.66 +		err = store.CreateSubscription(sub)
    1.67  		if err != nil {
    1.68  			t.Fatalf("Error saving subscription in %T: %s\n", store, err)
    1.69  		}
    1.70 @@ -292,11 +292,11 @@
    1.71  			if !match {
    1.72  				t.Errorf("Expected field `%s` to be `%v`, got `%v`\n", field, expected, got)
    1.73  			}
    1.74 -			err = store.updateSubscription(sub.UserID, change)
    1.75 +			err = store.UpdateSubscription(sub.UserID, change)
    1.76  			if err != nil {
    1.77  				t.Errorf("Error updating subscription in %T: %s\n", store, err)
    1.78  			}
    1.79 -			retrieved, err := store.getSubscriptions([]uuid.ID{sub.UserID})
    1.80 +			retrieved, err := store.GetSubscriptions([]uuid.ID{sub.UserID})
    1.81  			if err != nil {
    1.82  				t.Errorf("Error getting subscription from %T: %s\n", store, err)
    1.83  			}
    1.84 @@ -311,22 +311,22 @@
    1.85  			sub = result
    1.86  		}
    1.87  
    1.88 -		err = store.createSubscription(sub2)
    1.89 +		err = store.CreateSubscription(sub2)
    1.90  		if err != nil {
    1.91  			t.Fatalf("Error saving subscription in %T: %+v\n", store, err)
    1.92  		}
    1.93  		change := SubscriptionChange{}
    1.94 -		err = store.updateSubscription(sub.UserID, change)
    1.95 +		err = store.UpdateSubscription(sub.UserID, change)
    1.96  		if err != ErrSubscriptionChangeEmpty {
    1.97  			t.Errorf("Expected err to be %+v, but got %+v from %T\n", ErrSubscriptionChangeEmpty, err, store)
    1.98  		}
    1.99  		stripeSubscription := sub2.StripeSubscription
   1.100  		change.StripeSubscription = &stripeSubscription
   1.101 -		err = store.updateSubscription(uuid.NewID(), change)
   1.102 +		err = store.UpdateSubscription(uuid.NewID(), change)
   1.103  		if err != ErrSubscriptionNotFound {
   1.104  			t.Errorf("Expected err to be %+v, but got %+v from %T\n", ErrSubscriptionNotFound, err, store)
   1.105  		}
   1.106 -		err = store.updateSubscription(sub.UserID, change)
   1.107 +		err = store.UpdateSubscription(sub.UserID, change)
   1.108  		if err != ErrStripeSubscriptionAlreadyExists {
   1.109  			t.Errorf("Expected err to be %+v, but got %+v from %T\n", ErrStripeSubscriptionAlreadyExists, err, store)
   1.110  		}
   1.111 @@ -335,7 +335,7 @@
   1.112  
   1.113  func TestDeleteSubscription(t *testing.T) {
   1.114  	for _, store := range testSubscriptionStores {
   1.115 -		err := store.reset()
   1.116 +		err := store.Reset()
   1.117  		if err != nil {
   1.118  			t.Fatalf("Error resetting %T: %+v\n", store, err)
   1.119  		}
   1.120 @@ -347,19 +347,19 @@
   1.121  			UserID:             uuid.NewID(),
   1.122  			StripeSubscription: "stripeSubscription2",
   1.123  		}
   1.124 -		err = store.createSubscription(sub1)
   1.125 +		err = store.CreateSubscription(sub1)
   1.126  		if err != nil {
   1.127  			t.Fatalf("Error creating %+v in %T: %+v\n", sub1, store, err)
   1.128  		}
   1.129 -		err = store.createSubscription(sub2)
   1.130 +		err = store.CreateSubscription(sub2)
   1.131  		if err != nil {
   1.132  			t.Fatalf("Error creating %+v in %T: %+v\n", sub2, store, err)
   1.133  		}
   1.134 -		err = store.deleteSubscription(sub1.UserID)
   1.135 +		err = store.DeleteSubscription(sub1.UserID)
   1.136  		if err != nil {
   1.137  			t.Fatalf("Error deleting %+v in %T: %+v\n", sub1, store, err)
   1.138  		}
   1.139 -		retrieved, err := store.getSubscriptions([]uuid.ID{sub1.UserID, sub2.UserID})
   1.140 +		retrieved, err := store.GetSubscriptions([]uuid.ID{sub1.UserID, sub2.UserID})
   1.141  		if err != nil {
   1.142  			t.Errorf("Error retrieving subscriptions from %T: %+v\n", store, err)
   1.143  		}
   1.144 @@ -371,7 +371,7 @@
   1.145  		if !ok {
   1.146  			t.Errorf("Expected to retrieve %s from %T, but missing was %+v\n", sub2.UserID.String(), store, missing)
   1.147  		}
   1.148 -		err = store.deleteSubscription(sub1.UserID)
   1.149 +		err = store.DeleteSubscription(sub1.UserID)
   1.150  		if err != ErrSubscriptionNotFound {
   1.151  			t.Errorf("Expected err to be %+v, but got %+v from %T\n", ErrSubscriptionNotFound, err, store)
   1.152  		}
   1.153 @@ -380,7 +380,7 @@
   1.154  
   1.155  func TestGetSubscriptions(t *testing.T) {
   1.156  	for _, store := range testSubscriptionStores {
   1.157 -		err := store.reset()
   1.158 +		err := store.Reset()
   1.159  		if err != nil {
   1.160  			t.Fatalf("Error resetting %T: %+v\n", store, err)
   1.161  		}
   1.162 @@ -411,23 +411,23 @@
   1.163  			PeriodEnd:          time.Now().Round(time.Millisecond),
   1.164  			Status:             "unpaid",
   1.165  		}
   1.166 -		err = store.createSubscription(sub1)
   1.167 +		err = store.CreateSubscription(sub1)
   1.168  		if err != nil {
   1.169  			t.Fatalf("Error creating %+v in %T: %+v\n", sub1, store, err)
   1.170  		}
   1.171 -		err = store.createSubscription(sub2)
   1.172 +		err = store.CreateSubscription(sub2)
   1.173  		if err != nil {
   1.174  			t.Fatalf("Error creating %+v in %T: %+v\n", sub1, store, err)
   1.175  		}
   1.176 -		err = store.createSubscription(sub3)
   1.177 +		err = store.CreateSubscription(sub3)
   1.178  		if err != nil {
   1.179  			t.Fatalf("Error creating %+v in %T: %+v\n", sub1, store, err)
   1.180  		}
   1.181 -		retrieved, err := store.getSubscriptions([]uuid.ID{})
   1.182 +		retrieved, err := store.GetSubscriptions([]uuid.ID{})
   1.183  		if err != ErrNoSubscriptionID {
   1.184  			t.Errorf("Error retrieving no subscriptions from %T. Expected %+v, got %+v\n", store, ErrNoSubscriptionID, err)
   1.185  		}
   1.186 -		retrieved, err = store.getSubscriptions([]uuid.ID{sub1.UserID})
   1.187 +		retrieved, err = store.GetSubscriptions([]uuid.ID{sub1.UserID})
   1.188  		if err != nil {
   1.189  			t.Errorf("Error retrieving %s from %T: %+v\n", sub1.UserID, store, err)
   1.190  		}
   1.191 @@ -436,7 +436,7 @@
   1.192  			t.Logf("Results: %+v\n", retrieved)
   1.193  			t.Errorf("Expected %+v to be in the results, was not for %T.\n", missing, store)
   1.194  		}
   1.195 -		retrieved, err = store.getSubscriptions([]uuid.ID{sub1.UserID, sub2.UserID})
   1.196 +		retrieved, err = store.GetSubscriptions([]uuid.ID{sub1.UserID, sub2.UserID})
   1.197  		if err != nil {
   1.198  			t.Errorf("Error retrieving %s and %s from %T: %+v\n", sub1.UserID, sub2.UserID, store, err)
   1.199  		}
   1.200 @@ -445,7 +445,7 @@
   1.201  			t.Logf("Results: %+v\n", retrieved)
   1.202  			t.Errorf("Expected %+v to be in the results, was not for %T.\n", missing, store)
   1.203  		}
   1.204 -		retrieved, err = store.getSubscriptions([]uuid.ID{sub1.UserID, sub3.UserID})
   1.205 +		retrieved, err = store.GetSubscriptions([]uuid.ID{sub1.UserID, sub3.UserID})
   1.206  		if err != nil {
   1.207  			t.Errorf("Error retrieving %s and %s from %T: %+v\n", sub1.UserID, sub3.UserID, store, err)
   1.208  		}
   1.209 @@ -454,7 +454,7 @@
   1.210  			t.Logf("Results: %+v\n", retrieved)
   1.211  			t.Errorf("Expected %+v to be in the results, was not for %T.\n", missing, store)
   1.212  		}
   1.213 -		retrieved, err = store.getSubscriptions([]uuid.ID{sub1.UserID, sub2.UserID, sub3.UserID})
   1.214 +		retrieved, err = store.GetSubscriptions([]uuid.ID{sub1.UserID, sub2.UserID, sub3.UserID})
   1.215  		if err != nil {
   1.216  			t.Errorf("Error retrieving %s, %s, and %s from %T: %+v\n", sub1.UserID, sub2.UserID, sub3.UserID, store, err)
   1.217  		}
   1.218 @@ -463,7 +463,7 @@
   1.219  			t.Logf("Results: %+v\n", retrieved)
   1.220  			t.Errorf("Expected %+v to be in the results, was not for %T.\n", missing, store)
   1.221  		}
   1.222 -		retrieved, err = store.getSubscriptions([]uuid.ID{sub2.UserID})
   1.223 +		retrieved, err = store.GetSubscriptions([]uuid.ID{sub2.UserID})
   1.224  		if err != nil {
   1.225  			t.Errorf("Error retrieving %s from %T: %+v\n", sub2.UserID, store, err)
   1.226  		}
   1.227 @@ -472,7 +472,7 @@
   1.228  			t.Logf("Results: %+v\n", retrieved)
   1.229  			t.Errorf("Expected %+v to be in the results, was not for %T.\n", missing, store)
   1.230  		}
   1.231 -		retrieved, err = store.getSubscriptions([]uuid.ID{sub2.UserID, sub3.UserID})
   1.232 +		retrieved, err = store.GetSubscriptions([]uuid.ID{sub2.UserID, sub3.UserID})
   1.233  		if err != nil {
   1.234  			t.Errorf("Error retrieving %s and %s from %T: %+v\n", sub2.UserID, sub3.UserID, store, err)
   1.235  		}
   1.236 @@ -481,7 +481,7 @@
   1.237  			t.Logf("Results: %+v\n", retrieved)
   1.238  			t.Errorf("Expected %+v to be in the results, was not for %T.\n", missing, store)
   1.239  		}
   1.240 -		retrieved, err = store.getSubscriptions([]uuid.ID{sub3.UserID})
   1.241 +		retrieved, err = store.GetSubscriptions([]uuid.ID{sub3.UserID})
   1.242  		if err != nil {
   1.243  			t.Errorf("Error retrieving %s from %T: %+v\n", sub3.UserID, store, err)
   1.244  		}
   1.245 @@ -490,14 +490,14 @@
   1.246  			t.Logf("Results: %+v\n", retrieved)
   1.247  			t.Errorf("Expected %+v to be in the results, was not for %T.\n", missing, store)
   1.248  		}
   1.249 -		retrieved, err = store.getSubscriptions([]uuid.ID{uuid.NewID()})
   1.250 +		retrieved, err = store.GetSubscriptions([]uuid.ID{uuid.NewID()})
   1.251  		if err != nil {
   1.252  			t.Errorf("Error retrieving non-existent ID from %T: %+v\n", store, err)
   1.253  		}
   1.254  		if len(retrieved) != 0 {
   1.255  			t.Errorf("Expected no results, %T returned %+v\n", store, retrieved)
   1.256  		}
   1.257 -		retrieved, err = store.getSubscriptions([]uuid.ID{sub1.UserID, sub2.UserID, uuid.NewID(), sub3.UserID})
   1.258 +		retrieved, err = store.GetSubscriptions([]uuid.ID{sub1.UserID, sub2.UserID, uuid.NewID(), sub3.UserID})
   1.259  		if err != nil {
   1.260  			t.Errorf("Error retrieving non-existent ID from %T: %+v\n", store, err)
   1.261  		}
   1.262 @@ -514,7 +514,7 @@
   1.263  
   1.264  func TestGetSubscriptionStats(t *testing.T) {
   1.265  	for _, store := range testSubscriptionStores {
   1.266 -		err := store.reset()
   1.267 +		err := store.Reset()
   1.268  		if err != nil {
   1.269  			t.Fatalf("Error resetting %T: %+v\n", store, err)
   1.270  		}
   1.271 @@ -530,11 +530,11 @@
   1.272  			Plan:               "plan2",
   1.273  			Status:             "past_due",
   1.274  		}
   1.275 -		err = store.createSubscription(sub1)
   1.276 +		err = store.CreateSubscription(sub1)
   1.277  		if err != nil {
   1.278  			t.Fatalf("Error creating %+v in %T: %+v\n", sub1, store, err)
   1.279  		}
   1.280 -		stats, err := store.getSubscriptionStats()
   1.281 +		stats, err := store.GetSubscriptionStats()
   1.282  		if err != nil {
   1.283  			t.Errorf("Error getting stats from %T: %+v\n", store, err)
   1.284  		}
   1.285 @@ -549,11 +549,11 @@
   1.286  		if !ok {
   1.287  			t.Errorf("Expected %s to be %+v, got %+v from %T\n", field, expected, results, store)
   1.288  		}
   1.289 -		err = store.createSubscription(sub2)
   1.290 +		err = store.CreateSubscription(sub2)
   1.291  		if err != nil {
   1.292  			t.Fatalf("Error creating %+v in %T: %+v\n", sub2, store, err)
   1.293  		}
   1.294 -		stats, err = store.getSubscriptionStats()
   1.295 +		stats, err = store.GetSubscriptionStats()
   1.296  		if err != nil {
   1.297  			t.Errorf("Error getting status from %T: %+v\n", store, err)
   1.298  		}
   1.299 @@ -569,11 +569,11 @@
   1.300  		if !ok {
   1.301  			t.Errorf("Expected %s to be %+v, got %+v from %T\n", field, expected, results, store)
   1.302  		}
   1.303 -		err = store.deleteSubscription(sub1.UserID)
   1.304 +		err = store.DeleteSubscription(sub1.UserID)
   1.305  		if err != nil {
   1.306  			t.Errorf("Error deleting subscription from %T: %+v\n", store, err)
   1.307  		}
   1.308 -		stats, err = store.getSubscriptionStats()
   1.309 +		stats, err = store.GetSubscriptionStats()
   1.310  		if err != nil {
   1.311  			t.Errorf("Error getting status from %T: %+v\n", store, err)
   1.312  		}