github.com/hairyhenderson/gomplate/v4@v4.0.0-pre-2.0.20240520121557-362f058f0c93/internal/tests/integration/datasources_blob_test.go (about)

     1  package integration
     2  
     3  import (
     4  	"bytes"
     5  	"net/http/httptest"
     6  	"os"
     7  	"testing"
     8  
     9  	"github.com/johannesboyne/gofakes3"
    10  	"github.com/johannesboyne/gofakes3/backend/s3mem"
    11  	"github.com/stretchr/testify/require"
    12  )
    13  
    14  func setupDatasourcesBlobTest(t *testing.T) *httptest.Server {
    15  	backend := s3mem.New()
    16  	s3 := gofakes3.New(backend)
    17  
    18  	srv := httptest.NewServer(s3.Server())
    19  	t.Cleanup(srv.Close)
    20  
    21  	err := backend.CreateBucket("mybucket")
    22  	require.NoError(t, err)
    23  	contents := `{"value":"json", "name":"foo"}`
    24  	_, err = backend.PutObject("mybucket", "foo.json", map[string]string{"Content-Type": "application/json"}, bytes.NewBufferString(contents), int64(len(contents)))
    25  	require.NoError(t, err)
    26  
    27  	contents = `{"value":"json", "name":"bar"}`
    28  	_, err = backend.PutObject("mybucket", "bar.json", map[string]string{"Content-Type": "application/json"}, bytes.NewBufferString(contents), int64(len(contents)))
    29  	require.NoError(t, err)
    30  
    31  	contents = `hello world`
    32  	_, err = backend.PutObject("mybucket", "a/b/c/hello.txt", map[string]string{"Content-Type": "text/plain"}, bytes.NewBufferString(contents), int64(len(contents)))
    33  	require.NoError(t, err)
    34  
    35  	contents = `goodbye world`
    36  	_, err = backend.PutObject("mybucket", "a/b/c/goodbye.txt", map[string]string{"Content-Type": "text/plain"}, bytes.NewBufferString(contents), int64(len(contents)))
    37  	require.NoError(t, err)
    38  
    39  	contents = "a: foo\nb: bar\nc:\n  cc: yay for yaml\n"
    40  	_, err = backend.PutObject("mybucket", "a/b/c/d", map[string]string{"Content-Type": "application/yaml"}, bytes.NewBufferString(contents), int64(len(contents)))
    41  	require.NoError(t, err)
    42  
    43  	return srv
    44  }
    45  
    46  func TestDatasources_Blob_S3Datasource(t *testing.T) {
    47  	o, e, err := cmd(t,
    48  		"-c", "data=s3://noaa-bathymetry-pds/csv/2022/03/02/20220302_056e577c7cd8323fdd8a04d3812cf78e_pointData.csv?region=us-east-1&type=text/csv",
    49  		"-i", `{{ index (index .data 0) 6 }}: {{ index (index .data 1) 6 }}
    50  {{ index (index .data 0) 5 }}: {{ index (index .data 1) 5 }}`).
    51  		withEnv("AWS_ANON", "true").
    52  		withEnv("AWS_TIMEOUT", "5000").
    53  		run()
    54  	assertSuccess(t, o, e, err, `PLATFORM_NAME: Ramform Hyperion
    55  TIME: 2022-03-01T22:00:04.000Z`)
    56  
    57  	srv := setupDatasourcesBlobTest(t)
    58  
    59  	o, e, err = cmd(t,
    60  		"-c", "data=s3://mybucket/foo.json?"+
    61  			"region=us-east-1&"+
    62  			"disableSSL=true&"+
    63  			"endpoint="+srv.Listener.Addr().String()+"&"+
    64  			"s3ForcePathStyle=true",
    65  		"-i", "{{ .data.value }}").
    66  		withEnv("AWS_ACCESS_KEY_ID", "YOUR-ACCESSKEYID").
    67  		withEnv("AWS_SECRET_ACCESS_KEY", "YOUR-SECRETACCESSKEY").
    68  		run()
    69  	assertSuccess(t, o, e, err, "json")
    70  
    71  	o, e, err = cmd(t,
    72  		"-c", "data=s3://mybucket/foo.json?"+
    73  			"region=us-east-1&"+
    74  			"disableSSL=true&"+
    75  			"s3ForcePathStyle=true",
    76  		"-i", "{{ .data.value }}").
    77  		withEnv("AWS_ANON", "true").
    78  		withEnv("AWS_S3_ENDPOINT", srv.Listener.Addr().String()).
    79  		run()
    80  	assertSuccess(t, o, e, err, "json")
    81  }
    82  
    83  func TestDatasources_Blob_S3Directory(t *testing.T) {
    84  	// This recently replaced ryft-public-sample-data after access was disabled.
    85  	// This bucket came from https://registry.opendata.aws, and is public. The
    86  	// content isn't important, just that it's something we can read and parse
    87  	// on a _real_ S3 bucket.
    88  	o, e, err := cmd(t, "-c", "data=s3://noaa-bathymetry-pds/csv/2022/03/02/?region=us-east-1",
    89  		"-i", "{{ index .data 0 }}").
    90  		withEnv("AWS_ANON", "true").
    91  		withEnv("AWS_TIMEOUT", "15000").
    92  		run()
    93  	assertSuccess(t, o, e, err, "20220302_056e577c7cd8323fdd8a04d3812cf78e_pointData.csv")
    94  
    95  	srv := setupDatasourcesBlobTest(t)
    96  
    97  	o, e, err = cmd(t, "-c", "data=s3://mybucket/a/b/c/?"+
    98  		"region=us-east-1&"+
    99  		"disableSSL=true&"+
   100  		"endpoint="+srv.Listener.Addr().String()+"&"+
   101  		"s3ForcePathStyle=true",
   102  		"-i", "{{ .data }}").
   103  		withEnv("AWS_ACCESS_KEY_ID", "YOUR-ACCESSKEYID").
   104  		withEnv("AWS_SECRET_ACCESS_KEY", "YOUR-SECRETACCESSKEY").
   105  		run()
   106  	assertSuccess(t, o, e, err, "[d goodbye.txt hello.txt]")
   107  }
   108  
   109  func TestDatasources_Blob_S3MIMETypes(t *testing.T) {
   110  	srv := setupDatasourcesBlobTest(t)
   111  	o, e, err := cmd(t, "-c", "data=s3://mybucket/a/b/c/d?"+
   112  		"region=us-east-1&"+
   113  		"disableSSL=true&"+
   114  		"endpoint="+srv.Listener.Addr().String()+"&"+
   115  		"s3ForcePathStyle=true",
   116  		"-i", "{{ .data.c.cc }}").
   117  		withEnv("AWS_ANON", "true").run()
   118  	assertSuccess(t, o, e, err, "yay for yaml")
   119  }
   120  
   121  func TestDatasources_Blob_GCSDatasource(t *testing.T) {
   122  	// this only works if we're authed with GCS
   123  	if os.Getenv("GOOGLE_APPLICATION_CREDENTIALS") == "" {
   124  		t.Skip("Not configured to authenticate with Google Cloud - skipping")
   125  		return
   126  	}
   127  
   128  	o, e, err := cmd(t, "-c", "data=gs://gcp-public-data-landsat/LT08/01/015/013/LT08_L1GT_015013_20130315_20170310_01_T2/LT08_L1GT_015013_20130315_20170310_01_T2_MTL.txt?type=text/plain",
   129  		"-i", "{{ len .data }}").
   130  		withEnv("GOOGLE_APPLICATION_CREDENTIALS",
   131  			os.Getenv("GOOGLE_APPLICATION_CREDENTIALS")).run()
   132  	assertSuccess(t, o, e, err, "3672")
   133  }
   134  
   135  func TestDatasources_Blob_GCSDirectory(t *testing.T) {
   136  	// this only works if we're likely to be authed with GCS
   137  	if os.Getenv("GOOGLE_APPLICATION_CREDENTIALS") == "" {
   138  		t.Skip("Not configured to authenticate with Google Cloud - skipping")
   139  		return
   140  	}
   141  
   142  	o, e, err := cmd(t, "-c", "data=gs://gcp-public-data-landsat/",
   143  		"-i", "{{ coll.Has .data `index.csv.gz` }}").
   144  		withEnv("GOOGLE_APPLICATION_CREDENTIALS",
   145  			os.Getenv("GOOGLE_APPLICATION_CREDENTIALS")).run()
   146  	assertSuccess(t, o, e, err, "true")
   147  }