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  }