|
Packit |
63bb0d |
// Package client contains functions for communicating with the API server
|
|
Packit |
63bb0d |
// Copyright (C) 2020 by Red Hat, Inc.
|
|
Packit |
63bb0d |
package client
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
import (
|
|
Packit |
63bb0d |
"net/http"
|
|
Packit |
63bb0d |
"testing"
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
"github.com/stretchr/testify/require"
|
|
Packit |
63bb0d |
)
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
func TestRequest(t *testing.T) {
|
|
Packit |
63bb0d |
// Make a request to the status route
|
|
Packit |
63bb0d |
resp, err := Request(testState.socket, "GET", "/api/status", "", map[string]string{})
|
|
Packit |
63bb0d |
require.NoError(t, err)
|
|
Packit |
63bb0d |
require.Equal(t, 200, resp.StatusCode)
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
// Make a request to a bad route
|
|
Packit |
63bb0d |
resp, err = Request(testState.socket, "GET", "/invalidroute", "", map[string]string{})
|
|
Packit |
63bb0d |
require.NoError(t, err)
|
|
Packit |
63bb0d |
require.Equal(t, http.StatusNotFound, resp.StatusCode)
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
// Test that apiError returns an error response
|
|
Packit |
63bb0d |
_, err = apiError(resp)
|
|
Packit |
63bb0d |
require.NoError(t, err)
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
// Make a request with a bad offset to trigger a JSON response with Status set to 400
|
|
Packit |
63bb0d |
resp, err = Request(testState.socket, "GET", "/api/v0/blueprints/list?offset=bad", "", map[string]string{})
|
|
Packit |
63bb0d |
require.NoError(t, err)
|
|
Packit |
63bb0d |
require.Equal(t, http.StatusBadRequest, resp.StatusCode)
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
func TestAPIErrorMsg(t *testing.T) {
|
|
Packit |
63bb0d |
err := APIErrorMsg{ID: "ERROR_ID", Msg: "Meaningful error message"}
|
|
Packit |
63bb0d |
require.Equal(t, "ERROR_ID: Meaningful error message", err.String())
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
func TestAPIResponse(t *testing.T) {
|
|
Packit |
63bb0d |
resp := APIResponse{Status: true}
|
|
Packit |
63bb0d |
require.Equal(t, "", resp.String())
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
resp = APIResponse{Status: false,
|
|
Packit |
63bb0d |
Errors: []APIErrorMsg{
|
|
Packit |
63bb0d |
{ID: "ONE_ERROR", Msg: "First message"},
|
|
Packit |
63bb0d |
{ID: "TWO_ERROR", Msg: "Second message"}},
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
require.Equal(t, "ONE_ERROR: First message", resp.String())
|
|
Packit |
63bb0d |
require.ElementsMatch(t, []string{
|
|
Packit |
63bb0d |
"ONE_ERROR: First message",
|
|
Packit |
63bb0d |
"TWO_ERROR: Second message"}, resp.AllErrors())
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
func TestGetRaw(t *testing.T) {
|
|
Packit |
63bb0d |
// Get raw data
|
|
Packit |
63bb0d |
b, resp, err := GetRaw(testState.socket, "GET", "/api/status")
|
|
Packit |
63bb0d |
require.NoError(t, err)
|
|
Packit |
63bb0d |
require.Nil(t, resp)
|
|
Packit |
63bb0d |
require.Greater(t, len(b), 0)
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
// Get an API error
|
|
Packit |
63bb0d |
b, resp, err = GetRaw(testState.socket, "GET", "/api/v0/blueprints/list?offset=bad")
|
|
Packit |
63bb0d |
require.NoError(t, err)
|
|
Packit |
63bb0d |
require.NotNilf(t, resp, "GetRaw bad request did not return an error: %v", b)
|
|
Packit |
63bb0d |
require.False(t, resp.Status)
|
|
Packit |
63bb0d |
require.GreaterOrEqual(t, len(resp.AllErrors()), 1)
|
|
Packit |
63bb0d |
require.Equal(t, "BadLimitOrOffset", resp.Errors[0].ID)
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
func TestGetJSONAll(t *testing.T) {
|
|
Packit |
63bb0d |
// Get all the projects
|
|
Packit |
63bb0d |
b, resp, err := GetJSONAll(testState.socket, "/api/v0/projects/list")
|
|
Packit |
63bb0d |
require.NoError(t, err)
|
|
Packit |
63bb0d |
require.Nil(t, resp)
|
|
Packit |
63bb0d |
require.GreaterOrEqualf(t, len(b), 100, "GetJSONAll response is too short: %#v", b)
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
// Run it on a route that doesn't support offset/limit
|
|
Packit |
63bb0d |
_, _, err = GetJSONAll(testState.socket, "/api/status")
|
|
Packit |
63bb0d |
require.EqualError(t, err, "Response is missing the total value")
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
func TestPostRaw(t *testing.T) {
|
|
Packit |
63bb0d |
// There are no routes that accept raw POST w/o Content-Type so this ends up testing the error path
|
|
Packit |
63bb0d |
b, resp, err := PostRaw(testState.socket, "/api/v0/blueprints/new", "nobody", nil)
|
|
Packit |
63bb0d |
require.NoError(t, err)
|
|
Packit |
63bb0d |
require.NotNilf(t, resp, "PostRaw bad request did not return an error: %v", b)
|
|
Packit |
63bb0d |
require.False(t, resp.Status)
|
|
Packit |
63bb0d |
require.GreaterOrEqualf(t, len(resp.AllErrors()), 1, "GetRaw error did not return error message: %#v", resp)
|
|
Packit |
63bb0d |
require.Equalf(t, "BlueprintsError", resp.Errors[0].ID, "GetRaw error ID is not BlueprintsError: %#v", resp)
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
func TestPostTOML(t *testing.T) {
|
|
Packit |
63bb0d |
blueprint := `name = "test-blueprint"
|
|
Packit |
63bb0d |
description = "TOML test blueprint"
|
|
Packit |
63bb0d |
version = "0.0.1"`
|
|
Packit |
63bb0d |
b, resp, err := PostTOML(testState.socket, "/api/v0/blueprints/new", blueprint)
|
|
Packit |
63bb0d |
require.NoError(t, err)
|
|
Packit |
63bb0d |
require.Nil(t, resp)
|
|
Packit |
63bb0d |
require.Contains(t, string(b), "true")
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
func TestPostJSON(t *testing.T) {
|
|
Packit |
63bb0d |
blueprint := `{"name": "test-blueprint",
|
|
Packit |
63bb0d |
"description": "JSON test blueprint",
|
|
Packit |
63bb0d |
"version": "0.0.1"}`
|
|
Packit |
63bb0d |
b, resp, err := PostJSON(testState.socket, "/api/v0/blueprints/new", blueprint)
|
|
Packit |
63bb0d |
require.NoError(t, err)
|
|
Packit |
63bb0d |
require.Nil(t, resp)
|
|
Packit |
63bb0d |
require.Contains(t, string(b), "true")
|
|
Packit |
63bb0d |
}
|