// Package tfeserver is a test stub implementing a subset of the TFE API used // only for the testing of the "terraform login" command. package tfeserver import ( "fmt" "net/http" "strings" ) const ( goodToken = "good-token" accountDetails = `{"data":{"id":"user-abc123","type":"users","attributes":{"username":"testuser","email":"testuser@example.com"}}}` MOTD = `{"msg":"Welcome to Terraform Cloud!"}` ) // Handler is an implementation of net/http.Handler that provides a stub // TFE API server implementation with the following endpoints: // // /ping - API existence endpoint // /account/details - current user endpoint var Handler http.Handler type handler struct{} func (h handler) ServeHTTP(resp http.ResponseWriter, req *http.Request) { resp.Header().Set("Content-Type", "application/vnd.api+json") switch req.URL.Path { case "/api/v2/ping": h.servePing(resp, req) case "/api/v2/account/details": h.serveAccountDetails(resp, req) case "/api/terraform/motd": h.serveMOTD(resp, req) default: fmt.Printf("404 when fetching %s\n", req.URL.String()) http.Error(resp, `{"errors":[{"status":"404","title":"not found"}]}`, http.StatusNotFound) } } func (h handler) servePing(resp http.ResponseWriter, req *http.Request) { resp.WriteHeader(http.StatusNoContent) } func (h handler) serveAccountDetails(resp http.ResponseWriter, req *http.Request) { if !strings.Contains(req.Header.Get("Authorization"), goodToken) { http.Error(resp, `{"errors":[{"status":"401","title":"unauthorized"}]}`, http.StatusUnauthorized) return } resp.WriteHeader(http.StatusOK) resp.Write([]byte(accountDetails)) } func (h handler) serveMOTD(resp http.ResponseWriter, req *http.Request) { resp.WriteHeader(http.StatusOK) resp.Write([]byte(MOTD)) } func init() { Handler = handler{} }