package api import ( "bytes" "encoding/json" "fmt" "io" "net/http" "net/http/httptest" "os" "strings" "testing" "github.com/aptly-dev/aptly/aptly" ctx "github.com/aptly-dev/aptly/context" "github.com/gin-gonic/gin" "github.com/smira/flag" . "gopkg.in/check.v1" ) func Test(t *testing.T) { TestingT(t) } type APISuite struct { context *ctx.AptlyContext flags *flag.FlagSet configFile *os.File router http.Handler } var _ = Suite(&APISuite{}) func createTestConfig() *os.File { file, err := os.CreateTemp("", "aptly") if err != nil { return nil } jsonString, err := json.Marshal(gin.H{ "architectures": []string{}, "enableMetricsEndpoint": true, }) if err != nil { return nil } _, _ = file.Write(jsonString) return file } func (s *APISuite) setupContext() error { aptly.Version = "testVersion" file := createTestConfig() if nil == file { return fmt.Errorf("unable to create the test configuration file") } s.configFile = file flags := flag.NewFlagSet("fakeFlags", flag.ContinueOnError) flags.Bool("no-lock", false, "dummy") flags.Int("db-open-attempts", 3, "dummy") flags.String("config", s.configFile.Name(), "dummy") flags.String("architectures", "", "dummy") s.flags = flags context, err := ctx.NewContext(s.flags) if nil != err { return err } s.context = context s.router = Router(context) return nil } func (s *APISuite) SetUpSuite(c *C) { err := s.setupContext() c.Assert(err, IsNil) } func (s *APISuite) TearDownSuite(c *C) { _ = os.Remove(s.configFile.Name()) s.context.Shutdown() } func (s *APISuite) SetUpTest(c *C) { } func (s *APISuite) TearDownTest(c *C) { } func (s *APISuite) HTTPRequest(method string, url string, body io.Reader) (*httptest.ResponseRecorder, error) { w := httptest.NewRecorder() req, err := http.NewRequest(method, url, body) if err != nil { return nil, err } req.Header.Add("Content-Type", "application/json") s.router.ServeHTTP(w, req) return w, nil } func (s *APISuite) TestGinRunsInReleaseMode(c *C) { c.Check(gin.Mode(), Equals, gin.ReleaseMode) } func (s *APISuite) TestGetVersion(c *C) { response, err := s.HTTPRequest("GET", "/api/version", nil) c.Assert(err, IsNil) c.Check(response.Code, Equals, 200) c.Check(response.Body.String(), Matches, "{\"Version\":\""+aptly.Version+"\"}") } func (s *APISuite) TestGetReadiness(c *C) { response, err := s.HTTPRequest("GET", "/api/ready", nil) c.Assert(err, IsNil) c.Check(response.Code, Equals, 200) c.Check(response.Body.String(), Matches, "{\"Status\":\"Aptly is ready\"}") } func (s *APISuite) TestGetHealthiness(c *C) { response, err := s.HTTPRequest("GET", "/api/healthy", nil) c.Assert(err, IsNil) c.Check(response.Code, Equals, 200) c.Check(response.Body.String(), Matches, "{\"Status\":\"Aptly is healthy\"}") } func (s *APISuite) TestGetMetrics(c *C) { response, err := s.HTTPRequest("GET", "/api/metrics", nil) c.Assert(err, IsNil) c.Check(response.Code, Equals, 200) b := strings.Replace(response.Body.String(), "\n", "", -1) c.Check(b, Matches, ".*# TYPE aptly_api_http_requests_in_flight gauge.*") c.Check(b, Matches, ".*# TYPE aptly_api_http_requests_total counter.*") c.Check(b, Matches, ".*# TYPE aptly_api_http_request_size_bytes summary.*") c.Check(b, Matches, ".*# TYPE aptly_api_http_response_size_bytes summary.*") c.Check(b, Matches, ".*# TYPE aptly_api_http_request_duration_seconds summary.*") c.Check(b, Matches, ".*# TYPE aptly_build_info gauge.*") c.Check(b, Matches, ".*aptly_build_info.*version=\"testVersion\".*") } func (s *APISuite) TestRepoCreate(c *C) { body, err := json.Marshal(gin.H{ "Name": "dummy", }) c.Assert(err, IsNil) _, err = s.HTTPRequest("POST", "/api/repos", bytes.NewReader(body)) c.Assert(err, IsNil) } func (s *APISuite) TestTruthy(c *C) { c.Check(truthy("no"), Equals, false) c.Check(truthy("n"), Equals, false) c.Check(truthy("off"), Equals, false) c.Check(truthy("false"), Equals, false) c.Check(truthy("0"), Equals, false) c.Check(truthy(false), Equals, false) c.Check(truthy(0), Equals, false) c.Check(truthy("y"), Equals, true) c.Check(truthy("yes"), Equals, true) c.Check(truthy("t"), Equals, true) c.Check(truthy("true"), Equals, true) c.Check(truthy("1"), Equals, true) c.Check(truthy(true), Equals, true) c.Check(truthy(1), Equals, true) c.Check(truthy(nil), Equals, false) c.Check(truthy("foobar"), Equals, true) c.Check(truthy(-1), Equals, true) c.Check(truthy(gin.H{}), Equals, true) }