package queryapi_test import ( "encoding/json" "net/http" "net/http/httptest" "strings" "testing" queryapi "queryorchestration/api/queryAPI" "queryorchestration/internal/client" clientupdate "queryorchestration/internal/client/update" "queryorchestration/internal/database/repository" "queryorchestration/internal/serviceconfig" "queryorchestration/internal/serviceconfig/queue/clientsync" "queryorchestration/internal/test" "github.com/labstack/echo/v4" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) type ClientConfig struct { serviceconfig.BaseConfig clientsync.ClientSyncConfig } func TestCreateClient(t *testing.T) { t.Parallel() cfg := &serviceconfig.BaseConfig{} net := test.GetNetwork(t) test.CreateDB(t, cfg, net, &test.CreateDatabaseConfig{}) cons := queryapi.NewControllers(&queryapi.Services{ Client: client.New(cfg), }) body := queryapi.ClientCreate{ Name: "example_name", Id: "external_id", } ctx, rec := createContextWithBody(t, body) err := cons.CreateClient(ctx) require.NoError(t, err) assert.Equal(t, http.StatusCreated, rec.Code) assertBody(t, rec, queryapi.ClientIDBody{ Id: body.Id, }) client, err := cfg.GetDBQueries().GetClient(t.Context(), "external_id") require.NoError(t, err) assert.Equal(t, "example_name", client.Name) assert.Equal(t, "external_id", client.Clientid) } func TestGetClient(t *testing.T) { t.Parallel() cfg := &serviceconfig.BaseConfig{} net := test.GetNetwork(t) test.CreateDB(t, cfg, net, &test.CreateDatabaseConfig{}) cons := queryapi.NewControllers(&queryapi.Services{ Client: client.New(cfg), }) id := "client_id" err := cfg.GetDBQueries().CreateClient(t.Context(), &repository.CreateClientParams{ Clientid: id, Name: "client_name", }) require.NoError(t, err) err = cfg.GetDBQueries().AddClientCanSync(t.Context(), &repository.AddClientCanSyncParams{ Clientid: id, Cansync: true, }) require.NoError(t, err) ctx, rec := createContext(t) err = cons.GetClient(ctx, id) require.NoError(t, err) assert.Equal(t, http.StatusOK, rec.Code) assertBody(t, rec, queryapi.DocClient{ Id: id, Name: "client_name", CanSync: true, }) } func TestUpdateClient(t *testing.T) { t.Parallel() cfg := &ClientConfig{} net := test.GetNetwork(t) test.CreateDB(t, cfg, net, &test.CreateDatabaseConfig{}) cons := queryapi.NewControllers(&queryapi.Services{ ClientUpdate: clientupdate.New(cfg, &clientupdate.Services{ Client: client.New(cfg), }), }) id := "client_id" err := cfg.GetDBQueries().CreateClient(t.Context(), &repository.CreateClientParams{ Clientid: id, Name: "client_name", }) require.NoError(t, err) newClientName := "new_name" body := queryapi.ClientUpdate{ Name: &newClientName, } ctx, rec := createContextWithBody(t, body) err = cons.UpdateClient(ctx, id) require.NoError(t, err) assert.Equal(t, http.StatusOK, rec.Code) assert.Empty(t, rec.Body.String()) client, err := cfg.GetDBQueries().GetClient(t.Context(), "client_id") require.NoError(t, err) assert.Equal(t, "new_name", client.Name) } func createContext(t testing.TB) (echo.Context, *httptest.ResponseRecorder) { return createContextWithBody(t, struct{}{}) } func createContextWithBody(t testing.TB, body interface{}) (echo.Context, *httptest.ResponseRecorder) { bodyBytes, err := json.Marshal(body) require.NoError(t, err) e := echo.New() req := httptest.NewRequest(http.MethodPost, "/", strings.NewReader(string(bodyBytes))) req.Header.Set(echo.HeaderContentType, echo.MIMEApplicationJSON) rec := httptest.NewRecorder() return e.NewContext(req, rec), rec } func assertBody[T any](t testing.TB, rec *httptest.ResponseRecorder, expected T) { res := getBody[T](t, rec) assert.EqualExportedValues(t, expected, res) } func getBody[T any](t testing.TB, rec *httptest.ResponseRecorder) T { var res T err := json.Unmarshal(rec.Body.Bytes(), &res) require.NoError(t, err) return res }