package console import ( "net/http" "testing" ) // /new-temporary takes /new's optional region fields, resolved the same way // and stored in the same insert as the expiry. func newTemporaryURL(fx *consoleFixture) string { return fx.ts.URL + "/api/cli/apps/" + fx.sqid + "/new-temporary" } func TestTemporaryCreateResolvesRegion(t *testing.T) { fx, token := regionFixture(t) fx.srv.cfg.TemporaryApps = true status, res := postJSON(t, newTemporaryURL(fx), map[string]any{"name": "tmp-tz", "timezone": "Europe/London"}, token) if status != http.StatusOK || res["region"] != "uk" || res["region_source"] != "timezone" || res["region_name"] != ukPlace || res["regions_available"] != float64(2) { t.Fatalf("timezone create = %d %v", status, res) } if r, src, _ := fx.st.AppRegion(OpsAccountID, "tmp-tz"); r != "uk" || src != "timezone" { t.Fatalf("stored %q %q", r, src) } if l := lifeOf(t, fx, "tmp-tz"); l == nil || !l.Temporary() { t.Fatalf("row = %+v, want a temporary row", l) } status, res = postJSON(t, newTemporaryURL(fx), map[string]any{"name": "tmp-chosen", "region": "uk"}, token) if status != http.StatusOK || res["region"] != "uk" || res["region_source"] != "chosen" { t.Fatalf("--region create = %d %v", status, res) } if r, src, _ := fx.st.AppRegion(OpsAccountID, "tmp-chosen"); r != "uk" || src != "chosen" { t.Fatalf("stored %q %q", r, src) } } func TestTemporaryCreateWithoutRegionGetsTheDefault(t *testing.T) { fx, token := regionFixture(t) fx.srv.cfg.TemporaryApps = true status, res := postJSON(t, newTemporaryURL(fx), map[string]any{"name": "tmp-plain"}, token) if status != http.StatusOK || res["region"] != "ie" || res["region_source"] != "default" { t.Fatalf("create = %d %v", status, res) } if r, src, _ := fx.st.AppRegion(OpsAccountID, "tmp-plain"); r != "" || src != "default" { t.Fatalf("stored %q %q", r, src) } } func TestTemporaryCreateRefusesABadRegionAndUnknownFields(t *testing.T) { fx, token := regionFixture(t) fx.srv.cfg.TemporaryApps = true status, res := postJSON(t, newTemporaryURL(fx), map[string]any{"name": "tmp-bad", "region": "Bad/Code"}, token) if status != http.StatusBadRequest || errOf(res) != msgRegionUnknown("Bad/Code", []string{"ie", "uk"}) { t.Fatalf("bad region = %d %v, want /new's refusal", status, res) } for _, extra := range []string{"place", "control_plane", "build_probe", "regions"} { name := "tmp-x" + extra[:2] status, _ := postJSON(t, newTemporaryURL(fx), map[string]any{"name": name, extra: "fleet/pi"}, token) if status != http.StatusBadRequest { t.Errorf("%s = %d, want 400", extra, status) } } for _, name := range []string{"tmp-bad", "tmp-xpl", "tmp-xco", "tmp-xbu", "tmp-xre"} { if has, _ := fx.st.HasAppIn(OpsAccountID, name); has { t.Errorf("a refused create still claimed %s", name) } } }