mirror of
https://github.com/Buriburizaem0n/nezha_domains.git
synced 2026-09-19 09:40:12 +00:00
79 lines
2.9 KiB
Go
79 lines
2.9 KiB
Go
package client
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestClientSQLiteHoldHelpersUseTypedRESTContracts(t *testing.T) {
|
|
// Given
|
|
receiptID := "ERERERERERERERERERERERERERERERERERERERERERE"
|
|
requests := make([]string, 0, 6)
|
|
server := httptest.NewServer(http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) {
|
|
requests = append(requests, request.URL.Path)
|
|
var payload map[string]json.RawMessage
|
|
require.NoError(t, json.NewDecoder(request.Body).Decode(&payload))
|
|
state := SQLiteHoldStateArmed
|
|
switch request.URL.Path {
|
|
case "/agentcompat/sqlite-hold/arm":
|
|
require.Empty(t, payload)
|
|
case "/agentcompat/sqlite-hold/wait":
|
|
require.JSONEq(t, `"`+receiptID+`"`, string(payload["id"]))
|
|
require.NoError(t, json.Unmarshal(payload["state"], &state))
|
|
require.Contains(t, []SQLiteHoldState{SQLiteHoldStateSelected, SQLiteHoldStateFinalizing}, state)
|
|
case "/agentcompat/sqlite-hold/snapshot":
|
|
require.Len(t, payload, 1)
|
|
state = SQLiteHoldStateSelected
|
|
case "/agentcompat/sqlite-hold/release":
|
|
require.Len(t, payload, 1)
|
|
state = SQLiteHoldStateReleased
|
|
case "/agentcompat/sqlite-hold/abort":
|
|
require.Len(t, payload, 1)
|
|
state = SQLiteHoldStateAborted
|
|
default:
|
|
writer.WriteHeader(http.StatusNotFound)
|
|
return
|
|
}
|
|
writer.Header().Set("Content-Type", "application/json")
|
|
_, err := writer.Write([]byte(`{"success":true,"data":{"id":"` + receiptID + `","state":"` + string(state) + `"}}`))
|
|
require.NoError(t, err)
|
|
}))
|
|
t.Cleanup(server.Close)
|
|
httpClient := newTestClient(t, Config{BaseURL: server.URL})
|
|
|
|
// When
|
|
armed, err := httpClient.ArmSQLiteHold(context.Background())
|
|
require.NoError(t, err)
|
|
selected, err := httpClient.WaitForSQLiteHold(context.Background(), armed, SQLiteHoldStateSelected)
|
|
require.NoError(t, err)
|
|
finalizing, err := httpClient.WaitForSQLiteHold(context.Background(), selected, SQLiteHoldStateFinalizing)
|
|
require.NoError(t, err)
|
|
snapshot, err := httpClient.SnapshotSQLiteHold(context.Background(), finalizing)
|
|
require.NoError(t, err)
|
|
released, err := httpClient.ReleaseSQLiteHold(context.Background(), snapshot)
|
|
require.NoError(t, err)
|
|
aborted, err := httpClient.AbortSQLiteHold(context.Background(), released)
|
|
|
|
// Then
|
|
require.NoError(t, err)
|
|
require.Equal(t, SQLiteHoldStateArmed, armed.State)
|
|
require.Equal(t, SQLiteHoldStateSelected, selected.State)
|
|
require.Equal(t, SQLiteHoldStateFinalizing, finalizing.State)
|
|
require.Equal(t, SQLiteHoldStateSelected, snapshot.State)
|
|
require.Equal(t, SQLiteHoldStateReleased, released.State)
|
|
require.Equal(t, SQLiteHoldStateAborted, aborted.State)
|
|
require.Equal(t, []string{
|
|
"/agentcompat/sqlite-hold/arm",
|
|
"/agentcompat/sqlite-hold/wait",
|
|
"/agentcompat/sqlite-hold/wait",
|
|
"/agentcompat/sqlite-hold/snapshot",
|
|
"/agentcompat/sqlite-hold/release",
|
|
"/agentcompat/sqlite-hold/abort",
|
|
}, requests)
|
|
}
|