From 5b2fa879888fdf5971ee5683026524f21e9ed8e8 Mon Sep 17 00:00:00 2001 From: Miles Maddox Date: Tue, 22 Mar 2022 03:06:39 +0000 Subject: [PATCH] add unit tests --- .drone.yml | 2 +- lib/history_test.go | 12 ++++++++++++ lib/query.go | 10 ++++------ lib/query_test.go | 31 +++++++++++++++++++++++++++++++ lib/util.go | 10 +++++++++- lib/util_test.go | 45 +++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 102 insertions(+), 8 deletions(-) create mode 100644 lib/history_test.go create mode 100644 lib/query_test.go create mode 100644 lib/util_test.go diff --git a/.drone.yml b/.drone.yml index 68825da..1ea5870 100644 --- a/.drone.yml +++ b/.drone.yml @@ -5,5 +5,5 @@ steps: - name: test image: golang commands: - - go test + - go test -v -failfast -cover ./lib - go build \ No newline at end of file diff --git a/lib/history_test.go b/lib/history_test.go new file mode 100644 index 0000000..fd93f23 --- /dev/null +++ b/lib/history_test.go @@ -0,0 +1,12 @@ +package lib + +import "testing" + +func TestSum(t *testing.T) { + he := HistoricalExecution{} + + err := RenderHistoryResults([]HistoricalExecution{he}, "csv") + if err != nil { + t.Errorf("Unable to render as %s", "csv") + } +} diff --git a/lib/query.go b/lib/query.go index ef93f2f..b9e3ff6 100644 --- a/lib/query.go +++ b/lib/query.go @@ -13,7 +13,6 @@ import ( "github.com/aws/aws-sdk-go/aws/awserr" "github.com/aws/aws-sdk-go/service/athena" "github.com/aws/aws-sdk-go/service/s3" - "github.com/aws/aws-sdk-go/service/s3/s3manager" "github.com/dustin/go-humanize" "github.com/olekukonko/tablewriter" csvmap "github.com/recursionpharma/go-csv-map" @@ -45,7 +44,7 @@ func (q *Query) Execute() (*os.File, error) { if _, err := os.Stat(q.SQL); err == nil { queryFromFile, err := ioutil.ReadFile(q.SQL) if err != nil { - return nil, fmt.Errorf("Unable to read query from file %s", q.SQL) + return nil, fmt.Errorf("unable to read query from file %s", q.SQL) } q.SQL = string(queryFromFile) } @@ -99,10 +98,9 @@ func (q *Query) Execute() (*os.File, error) { file, err := ioutil.TempFile("", "athena-query-results-"+*result.QueryExecutionId) if err != nil { - return nil, fmt.Errorf("Unable to create temp file %q, %v", *result.QueryExecutionId, err) + return nil, fmt.Errorf("unable to create temp file %q, %v", *result.QueryExecutionId, err) } - downloader := s3manager.NewDownloader(sess) numBytes, err := downloader.Download(file, &s3.GetObjectInput{ Bucket: aws.String(q.QueryResultsBucket), Key: aws.String(*result.QueryExecutionId + ".csv"), @@ -112,11 +110,11 @@ func (q *Query) Execute() (*os.File, error) { if aerr, ok := err.(awserr.Error); ok { switch aerr.Code() { case s3.ErrCodeNoSuchBucket: - return nil, fmt.Errorf("Unable to download query results for %q. Bucket %s does not exist", *result.QueryExecutionId, q.QueryResultsBucket) + return nil, fmt.Errorf("unable to download query results for %q. Bucket %s does not exist", *result.QueryExecutionId, q.QueryResultsBucket) case s3.ErrCodeNoSuchKey: return nil, nil default: - return nil, fmt.Errorf("Unable to download query results for %q, %v", *result.QueryExecutionId, err) + return nil, fmt.Errorf("unable to download query results for %q, %v", *result.QueryExecutionId, err) } } } diff --git a/lib/query_test.go b/lib/query_test.go new file mode 100644 index 0000000..005774c --- /dev/null +++ b/lib/query_test.go @@ -0,0 +1,31 @@ +package lib + +import ( + "fmt" + "testing" +) + +func init() { + svc = &mockAthenaClient{} + downloader = &mockDownloaderAPI{} +} + +func Test_QueryExecute(t *testing.T) { + q := Query{ + Database: "default", + SQL: "SELECT 1", + OutputFile: "/dev/stdout", + QueryResultsBucket: "test", + Format: "csv", + Statistics: false, + } + + f, err := q.Execute() + if err != nil { + t.Errorf("Could note Execute() query: %v", err.Error()) + return + } + + fmt.Println(f.Name()) + +} diff --git a/lib/util.go b/lib/util.go index 68a6aaa..e7419e7 100644 --- a/lib/util.go +++ b/lib/util.go @@ -8,6 +8,9 @@ import ( "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/athena" + "github.com/aws/aws-sdk-go/service/athena/athenaiface" + "github.com/aws/aws-sdk-go/service/s3/s3manager" + "github.com/aws/aws-sdk-go/service/s3/s3manager/s3manageriface" "github.com/aws/aws-sdk-go/service/sts" "github.com/sirupsen/logrus" ) @@ -16,15 +19,20 @@ var ( sess = session.Must(session.NewSessionWithOptions(session.Options{ SharedConfigState: session.SharedConfigEnable, })) - svc = athena.New(sess) + svc athenaiface.AthenaAPI + downloader s3manageriface.DownloaderAPI ) func init() { + svc = athena.New(sess) + downloader = s3manager.NewDownloader(sess) + lvl, ok := os.LookupEnv("LOG_LEVEL") // LOG_LEVEL not set, let's default to info if !ok { lvl = "info" } + // parse string, this is built-in feature of logrus ll, err := logrus.ParseLevel(lvl) if err != nil { diff --git a/lib/util_test.go b/lib/util_test.go new file mode 100644 index 0000000..c473997 --- /dev/null +++ b/lib/util_test.go @@ -0,0 +1,45 @@ +package lib + +import ( + "io" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/service/athena" + "github.com/aws/aws-sdk-go/service/athena/athenaiface" + "github.com/aws/aws-sdk-go/service/s3" + "github.com/aws/aws-sdk-go/service/s3/s3manager" + "github.com/aws/aws-sdk-go/service/s3/s3manager/s3manageriface" +) + +// Define a mock struct to be used in your unit tests of myFunc. +type mockAthenaClient struct { + athenaiface.AthenaAPI +} + +func (m *mockAthenaClient) StartQueryExecution(input *athena.StartQueryExecutionInput) (*athena.StartQueryExecutionOutput, error) { + // mock response/functionality + return &athena.StartQueryExecutionOutput{ + QueryExecutionId: aws.String("xxxyyyzzz"), + }, nil +} + +func (m *mockAthenaClient) GetQueryExecution(input *athena.GetQueryExecutionInput) (*athena.GetQueryExecutionOutput, error) { + // mock response/functionality + return &athena.GetQueryExecutionOutput{ + QueryExecution: &athena.QueryExecution{ + QueryExecutionId: aws.String("xxxyyyzzz"), + Status: &athena.QueryExecutionStatus{ + State: aws.String(athena.QueryExecutionStateSucceeded), + }, + }, + }, nil +} + +// mock the downloader +type mockDownloaderAPI struct { + s3manageriface.DownloaderAPI +} + +func (m *mockDownloaderAPI) Download(io.WriterAt, *s3.GetObjectInput, ...func(*s3manager.Downloader)) (int64, error) { + return 100, nil +}