ducky/subscriptions
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.
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 }