github.com/mweagle/Sparta@v1.15.0/test.go (about) 1 package sparta 2 3 import ( 4 "bytes" 5 "context" 6 "os" 7 "testing" 8 ) 9 10 const lambdaTestExecuteARN = "LambdaExecutor" 11 const s3BucketSourceArn = "arn:aws:s3:::sampleBucket" 12 const snsTopicSourceArn = "arn:aws:sns:us-west-2:000000000000:someTopic" 13 const dynamoDBTableArn = "arn:aws:dynamodb:us-west-2:000000000000:table/sampleTable" 14 15 func mockLambda1(ctx context.Context) (string, error) { 16 return "mockLambda1!", nil 17 } 18 19 func mockLambda2(ctx context.Context) (string, error) { 20 return "mockLambda2!", nil 21 } 22 23 func mockLambda3(ctx context.Context) (string, error) { 24 return "mockLambda3!", nil 25 } 26 27 func testLambdaData() []*LambdaAWSInfo { 28 var lambdaFunctions []*LambdaAWSInfo 29 30 ////////////////////////////////////////////////////////////////////////////// 31 // Lambda function 1 32 lambdaFn1, lambdaFn1Err := NewAWSLambda(LambdaName(mockLambda1), 33 mockLambda1, 34 lambdaTestExecuteARN) 35 if lambdaFn1Err != nil { 36 panic("Failed to create lambda1") 37 } 38 lambdaFn1.Permissions = append(lambdaFn1.Permissions, S3Permission{ 39 BasePermission: BasePermission{ 40 SourceArn: s3BucketSourceArn, 41 }, 42 // Event Filters are defined at 43 // http://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html 44 Events: []string{"s3:ObjectCreated:*", "s3:ObjectRemoved:*"}, 45 }) 46 47 lambdaFn1.Permissions = append(lambdaFn1.Permissions, SNSPermission{ 48 BasePermission: BasePermission{ 49 SourceArn: snsTopicSourceArn, 50 }, 51 }) 52 53 lambdaFn1.EventSourceMappings = append(lambdaFn1.EventSourceMappings, &EventSourceMapping{ 54 StartingPosition: "TRIM_HORIZON", 55 EventSourceArn: dynamoDBTableArn, 56 BatchSize: 10, 57 }) 58 59 lambdaFunctions = append(lambdaFunctions, lambdaFn1) 60 61 ////////////////////////////////////////////////////////////////////////////// 62 // Lambda function 2 63 lambdaFn2, lambdaFn2Err := NewAWSLambda(LambdaName(mockLambda2), 64 mockLambda2, 65 lambdaTestExecuteARN) 66 if lambdaFn2Err != nil { 67 panic("Failed to create lambda2") 68 } 69 lambdaFunctions = append(lambdaFunctions, lambdaFn2) 70 71 ////////////////////////////////////////////////////////////////////////////// 72 // Lambda function 3 73 // https://github.com/mweagle/Sparta/pull/1 74 lambdaFn3, lambdaFn3Err := NewAWSLambda(LambdaName(mockLambda3), 75 mockLambda3, 76 lambdaTestExecuteARN) 77 if lambdaFn3Err != nil { 78 panic("Failed to create lambda3") 79 } 80 lambdaFn3.Permissions = append(lambdaFn3.Permissions, SNSPermission{ 81 BasePermission: BasePermission{ 82 SourceArn: snsTopicSourceArn, 83 }, 84 }) 85 lambdaFunctions = append(lambdaFunctions, lambdaFn3) 86 return lambdaFunctions 87 } 88 89 // testProvisionEvaluator is the function that is called following a 90 // provision to determine if the result was successful 91 type testProvisionEvaluator func(t *testing.T, didError error) error 92 93 // assertSuccess is a default handler for the ProvisionRunner. If no 94 // evaluator is supplied, defaults to expecting no didError 95 func assertSuccess(t *testing.T, didError error) error { 96 if didError != nil { 97 t.Fatal("Provision failed: " + didError.Error()) 98 } 99 return nil 100 } 101 102 // assertError returns a test evaluator that enforces that didError is not nil 103 func assertError(message string) testProvisionEvaluator { 104 return func(t *testing.T, didError error) error { 105 t.Logf("Checking provisioning error: %s", didError) 106 if didError == nil { 107 t.Fatal("Failed to reject error due to: " + message) 108 } 109 return nil 110 } 111 } 112 113 // testProvision is a convenience function for testProvisionEx 114 func testProvision(t *testing.T, 115 lambdaAWSInfos []*LambdaAWSInfo, 116 evaluator testProvisionEvaluator) { 117 118 testProvisionEx(t, lambdaAWSInfos, nil, nil, nil, false, evaluator) 119 } 120 121 // testProvisionEx handles mock provisioning a service and then 122 // supplying the result to the evaluator function 123 func testProvisionEx(t *testing.T, 124 lambdaAWSInfos []*LambdaAWSInfo, 125 api APIGateway, 126 site *S3Site, 127 workflowHooks *WorkflowHooks, 128 useCGO bool, 129 evaluator testProvisionEvaluator) { 130 131 if evaluator == nil { 132 evaluator = assertSuccess 133 } 134 135 logger, loggerErr := NewLogger("info") 136 if loggerErr != nil { 137 t.Fatalf("Failed to create test logger: %s", loggerErr) 138 } 139 var templateWriter bytes.Buffer 140 err := Provision(true, 141 "SampleProvision", 142 "", 143 lambdaAWSInfos, 144 nil, 145 nil, 146 os.Getenv("S3_BUCKET"), 147 false, 148 false, 149 "testBuildID", 150 "", 151 "", 152 "", 153 &templateWriter, 154 nil, 155 logger) 156 if evaluator != nil { 157 err = evaluator(t, err) 158 } 159 if err != nil { 160 t.Fatalf("Failed to apply evaluator: " + err.Error()) 161 } 162 }