Skip to content

Commit

Permalink
atlasexec: added --context to the MigrateLintParams (#23)
Browse files Browse the repository at this point in the history
  • Loading branch information
dorav committed Sep 28, 2023
1 parent ef784ee commit b295faf
Show file tree
Hide file tree
Showing 2 changed files with 125 additions and 55 deletions.
4 changes: 4 additions & 0 deletions atlasexec/atlas.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ type (
ConfigURL string
DevURL string
DirURL string
Context string
Web bool
Latest uint64
Vars Vars
Expand Down Expand Up @@ -291,6 +292,9 @@ func lintArgs(params *MigrateLintParams) []string {
} else {
args = append(args, "--format", "{{ json . }}")
}
if params.Context != "" {
args = append(args, "--context", params.Context)
}
if params.Env != "" {
args = append(args, "--env", params.Env)
}
Expand Down
176 changes: 121 additions & 55 deletions atlasexec/atlas_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -150,62 +150,68 @@ func TestMigrateLint(t *testing.T) {
}

func TestMigrateLintWithLogin(t *testing.T) {
type graphQLQuery struct {
Query string `json:"query"`
Variables json.RawMessage `json:"variables"`
}
type Dir struct {
Name string `json:"name"`
Content string `json:"content"`
Slug string `json:"slug"`
}
type dirsQueryResponse struct {
Data struct {
Dirs []Dir `json:"dirs"`
} `json:"data"`
}
token := "123456789"
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
require.Equal(t, "Bearer "+token, r.Header.Get("Authorization"))
var query graphQLQuery
require.NoError(t, json.NewDecoder(r.Body).Decode(&query))
switch {
case strings.Contains(query.Query, "mutation reportMigrationLint"):
_, err := fmt.Fprintf(w, `{ "data": { "reportMigrationLint": { "url": "https://migration-lint-report-url" } } }`)
require.NoError(t, err)
case strings.Contains(query.Query, "query dirs"):
dir, err := migrate.NewLocalDir("./testdata/migrations")
require.NoError(t, err)
ad, err := migrate.ArchiveDir(dir)
require.NoError(t, err)
var resp dirsQueryResponse
resp.Data.Dirs = []Dir{{
Name: "test-dir-name",
Slug: "test-dir-slug",
Content: base64.StdEncoding.EncodeToString(ad),
}}
st2bytes, err := json.Marshal(resp)
require.NoError(t, err)
_, err = fmt.Fprint(w, string(st2bytes))
require.NoError(t, err)
type (
ContextInput struct {
Repo string `json:"repo"`
Path string `json:"path"`
Branch string `json:"branch"`
Commit string `json:"commit"`
}
}))
t.Cleanup(srv.Close)
st := fmt.Sprintf(
`atlas {
cloud {
token = %q
url = %q
migrateLintReport struct {
Context *ContextInput `json:"context"`
}
graphQLQuery struct {
Query string `json:"query"`
Variables json.RawMessage `json:"variables"`
MigrateLintReport struct {
migrateLintReport `json:"input"`
}
}
env "test" {}
`, token, srv.URL)
atlasConfigURL, clean, err := atlasexec.TempFile(st, "hcl")
require.NoError(t, err)
t.Cleanup(func() {
require.NoError(t, clean())
})
Dir struct {
Name string `json:"name"`
Content string `json:"content"`
Slug string `json:"slug"`
}
dirsQueryResponse struct {
Data struct {
Dirs []Dir `json:"dirs"`
} `json:"data"`
}
)
token := "123456789"
handler := func(payloads *[]graphQLQuery) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
require.Equal(t, "Bearer "+token, r.Header.Get("Authorization"))
var query graphQLQuery
require.NoError(t, json.NewDecoder(r.Body).Decode(&query))
*payloads = append(*payloads, query)
switch {
case strings.Contains(query.Query, "mutation reportMigrationLint"):
_, err := fmt.Fprintf(w, `{ "data": { "reportMigrationLint": { "url": "https://migration-lint-report-url" } } }`)
require.NoError(t, err)
case strings.Contains(query.Query, "query dirs"):
dir, err := migrate.NewLocalDir("./testdata/migrations")
require.NoError(t, err)
ad, err := migrate.ArchiveDir(dir)
require.NoError(t, err)
var resp dirsQueryResponse
resp.Data.Dirs = []Dir{{
Name: "test-dir-name",
Slug: "test-dir-slug",
Content: base64.StdEncoding.EncodeToString(ad),
}}
st2bytes, err := json.Marshal(resp)
require.NoError(t, err)
_, err = fmt.Fprint(w, string(st2bytes))
require.NoError(t, err)
}
}
}
t.Run("Web and Writer params produces an error", func(t *testing.T) {
var payloads []graphQLQuery
srv := httptest.NewServer(handler(&payloads))
t.Cleanup(srv.Close)
atlasConfigURL := generateHCL(t, token, srv)
c, err := atlasexec.NewClient(".", "atlas")
require.NoError(t, err)
params := &atlasexec.MigrateLintParams{
Expand All @@ -224,21 +230,30 @@ func TestMigrateLintWithLogin(t *testing.T) {
require.ErrorContains(t, err, "Writer or Web reporting are not supported")
require.Nil(t, got)
})
t.Run("lint parse web output", func(t *testing.T) {
t.Run("lint parse web output - no error", func(t *testing.T) {
var payloads []graphQLQuery
srv := httptest.NewServer(handler(&payloads))
t.Cleanup(srv.Close)
atlasConfigURL := generateHCL(t, token, srv)
c, err := atlasexec.NewClient(".", "atlas")
require.NoError(t, err)
var buf bytes.Buffer
require.NoError(t, c.MigrateLintError(context.Background(), &atlasexec.MigrateLintParams{
err = c.MigrateLintError(context.Background(), &atlasexec.MigrateLintParams{
DevURL: "sqlite://file?mode=memory",
DirURL: "file://testdata/migrations",
ConfigURL: atlasConfigURL,
Latest: 1,
Writer: &buf,
Web: true,
}))
})
require.NoError(t, err)
require.Equal(t, strings.TrimSpace(buf.String()), "https://migration-lint-report-url")
})
t.Run("lint uses --base", func(t *testing.T) {
var payloads []graphQLQuery
srv := httptest.NewServer(handler(&payloads))
t.Cleanup(srv.Close)
atlasConfigURL := generateHCL(t, token, srv)
c, err := atlasexec.NewClient(".", "atlas")
require.NoError(t, err)
summary, err := c.MigrateLint(context.Background(), &atlasexec.MigrateLintParams{
Expand All @@ -250,6 +265,57 @@ func TestMigrateLintWithLogin(t *testing.T) {
require.NoError(t, err)
require.NotNil(t, summary)
})
t.Run("lint uses --context has error", func(t *testing.T) {
var payloads []graphQLQuery
srv := httptest.NewServer(handler(&payloads))
t.Cleanup(srv.Close)
atlasConfigURL := generateHCL(t, token, srv)
c, err := atlasexec.NewClient(".", "atlas")
require.NoError(t, err)
var buf bytes.Buffer
err = c.MigrateLintError(context.Background(), &atlasexec.MigrateLintParams{
DevURL: "sqlite://file?mode=memory",
DirURL: "file://testdata/migrations",
ConfigURL: atlasConfigURL,
Base: "atlas://test-dir-slug",
Context: `{"repo":"testing-repo", "path":"path/to/dir","branch":"testing-branch", "commit":"sha123"}`,
Writer: &buf,
Web: true,
})
require.ErrorContains(t, err, "https://migration-lint-report-url")
found := false
for _, query := range payloads {
if !strings.Contains(query.Query, "mutation reportMigrationLint") {
continue
}
found = true
require.NoError(t, json.Unmarshal(query.Variables, &query.MigrateLintReport))
require.Equal(t, "testing-branch", query.MigrateLintReport.Context.Branch)
require.Equal(t, "sha123", query.MigrateLintReport.Context.Commit)
require.Equal(t, "path/to/dir", query.MigrateLintReport.Context.Path)
require.Equal(t, "testing-repo", query.MigrateLintReport.Context.Repo)
}
require.True(t, found)
require.Equal(t, strings.TrimSpace(buf.String()), "https://migration-lint-report-url")
})
}

func generateHCL(t *testing.T, token string, srv *httptest.Server) string {
st := fmt.Sprintf(
`atlas {
cloud {
token = %q
url = %q
}
}
env "test" {}
`, token, srv.URL)
atlasConfigURL, clean, err := atlasexec.TempFile(st, "hcl")
require.NoError(t, err)
t.Cleanup(func() {
require.NoError(t, clean())
})
return atlasConfigURL
}

func Test_MigrateStatus(t *testing.T) {
Expand Down

0 comments on commit b295faf

Please sign in to comment.