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 }