test: add signing parties API test script
This commit is contained in:
parent
93eab1931e
commit
47a98da4e4
|
|
@ -0,0 +1,293 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"os"
|
||||
"time"
|
||||
|
||||
"github.com/golang-jwt/jwt/v5"
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
type Claims struct {
|
||||
SessionID string `json:"session_id"`
|
||||
PartyID string `json:"party_id"`
|
||||
TokenType string `json:"token_type"`
|
||||
jwt.RegisteredClaims
|
||||
}
|
||||
|
||||
func generateAccessToken(secretKey, userID, username string) (string, error) {
|
||||
now := time.Now()
|
||||
claims := Claims{
|
||||
PartyID: username,
|
||||
TokenType: "access",
|
||||
RegisteredClaims: jwt.RegisteredClaims{
|
||||
ID: uuid.New().String(),
|
||||
Issuer: "mpc-system",
|
||||
Subject: userID,
|
||||
IssuedAt: jwt.NewNumericDate(now),
|
||||
NotBefore: jwt.NewNumericDate(now),
|
||||
ExpiresAt: jwt.NewNumericDate(now.Add(24 * time.Hour)),
|
||||
},
|
||||
}
|
||||
|
||||
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
|
||||
return token.SignedString([]byte(secretKey))
|
||||
}
|
||||
|
||||
func makeRequest(method, url string, body interface{}, token, apiKey string) (int, []byte, error) {
|
||||
var reqBody io.Reader
|
||||
if body != nil {
|
||||
jsonData, err := json.Marshal(body)
|
||||
if err != nil {
|
||||
return 0, nil, err
|
||||
}
|
||||
reqBody = bytes.NewBuffer(jsonData)
|
||||
}
|
||||
|
||||
req, err := http.NewRequest(method, url, reqBody)
|
||||
if err != nil {
|
||||
return 0, nil, err
|
||||
}
|
||||
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
req.Header.Set("X-API-Key", apiKey)
|
||||
req.Header.Set("Authorization", "Bearer "+token)
|
||||
|
||||
client := &http.Client{Timeout: 10 * time.Second}
|
||||
resp, err := client.Do(req)
|
||||
if err != nil {
|
||||
return 0, nil, err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
respBody, err := io.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
return 0, nil, err
|
||||
}
|
||||
|
||||
return resp.StatusCode, respBody, nil
|
||||
}
|
||||
|
||||
func main() {
|
||||
// Get JWT secret from environment or use test value
|
||||
jwtSecret := os.Getenv("JWT_SECRET_KEY")
|
||||
if jwtSecret == "" {
|
||||
jwtSecret = "change_this_jwt_secret_key_to_random_value_min_32_chars"
|
||||
}
|
||||
|
||||
// Generate access token
|
||||
token, err := generateAccessToken(jwtSecret, "admin", "admin")
|
||||
if err != nil {
|
||||
fmt.Printf("Failed to generate token: %v\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
// Get API key from environment or use test value
|
||||
apiKey := os.Getenv("MPC_API_KEY")
|
||||
if apiKey == "" {
|
||||
apiKey = "test-api-key"
|
||||
}
|
||||
|
||||
// Use the wallet created from keygen test
|
||||
username := "wallet-83a6d1d3"
|
||||
baseURL := "http://localhost:4000/api/v1/accounts/by-username/" + username + "/signing-config"
|
||||
|
||||
fmt.Println("===========================================")
|
||||
fmt.Println("Testing Signing Parties Configuration APIs")
|
||||
fmt.Println("===========================================")
|
||||
fmt.Printf("Username: %s\n\n", username)
|
||||
|
||||
// Test 1: GET - Query current signing parties configuration
|
||||
fmt.Println("--------------------------------------------")
|
||||
fmt.Println("Test 1: GET signing-config (Query)")
|
||||
fmt.Println("--------------------------------------------")
|
||||
status, body, err := makeRequest("GET", baseURL, nil, token, apiKey)
|
||||
if err != nil {
|
||||
fmt.Printf("Error: %v\n", err)
|
||||
} else {
|
||||
fmt.Printf("Status: %d\n", status)
|
||||
var result map[string]interface{}
|
||||
json.Unmarshal(body, &result)
|
||||
prettyJSON, _ := json.MarshalIndent(result, "", " ")
|
||||
fmt.Printf("Response:\n%s\n", prettyJSON)
|
||||
}
|
||||
|
||||
// Extract active parties from the response for later tests
|
||||
var activeParties []string
|
||||
var result map[string]interface{}
|
||||
json.Unmarshal(body, &result)
|
||||
if parties, ok := result["active_parties"].([]interface{}); ok {
|
||||
for _, p := range parties {
|
||||
if s, ok := p.(string); ok {
|
||||
activeParties = append(activeParties, s)
|
||||
}
|
||||
}
|
||||
}
|
||||
fmt.Printf("\nActive parties found: %v\n", activeParties)
|
||||
|
||||
if len(activeParties) < 2 {
|
||||
fmt.Println("\nError: Need at least 2 active parties for testing")
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
// Test 2: POST - Set signing parties (select first 2 parties)
|
||||
fmt.Println("\n--------------------------------------------")
|
||||
fmt.Println("Test 2: POST signing-config (Set)")
|
||||
fmt.Println("--------------------------------------------")
|
||||
signingParties := activeParties[:2] // Select first 2 parties
|
||||
setData := map[string]interface{}{
|
||||
"party_ids": signingParties,
|
||||
}
|
||||
fmt.Printf("Setting signing parties to: %v\n", signingParties)
|
||||
status, body, err = makeRequest("POST", baseURL, setData, token, apiKey)
|
||||
if err != nil {
|
||||
fmt.Printf("Error: %v\n", err)
|
||||
} else {
|
||||
fmt.Printf("Status: %d\n", status)
|
||||
var result map[string]interface{}
|
||||
json.Unmarshal(body, &result)
|
||||
prettyJSON, _ := json.MarshalIndent(result, "", " ")
|
||||
fmt.Printf("Response:\n%s\n", prettyJSON)
|
||||
}
|
||||
|
||||
// Test 3: GET - Query again to verify it was set
|
||||
fmt.Println("\n--------------------------------------------")
|
||||
fmt.Println("Test 3: GET signing-config (Verify Set)")
|
||||
fmt.Println("--------------------------------------------")
|
||||
status, body, err = makeRequest("GET", baseURL, nil, token, apiKey)
|
||||
if err != nil {
|
||||
fmt.Printf("Error: %v\n", err)
|
||||
} else {
|
||||
fmt.Printf("Status: %d\n", status)
|
||||
var result map[string]interface{}
|
||||
json.Unmarshal(body, &result)
|
||||
prettyJSON, _ := json.MarshalIndent(result, "", " ")
|
||||
fmt.Printf("Response:\n%s\n", prettyJSON)
|
||||
}
|
||||
|
||||
// Test 4: POST again - Should fail (already configured)
|
||||
fmt.Println("\n--------------------------------------------")
|
||||
fmt.Println("Test 4: POST signing-config (Should Fail - Already Set)")
|
||||
fmt.Println("--------------------------------------------")
|
||||
status, body, err = makeRequest("POST", baseURL, setData, token, apiKey)
|
||||
if err != nil {
|
||||
fmt.Printf("Error: %v\n", err)
|
||||
} else {
|
||||
fmt.Printf("Status: %d (expected 409 Conflict)\n", status)
|
||||
var result map[string]interface{}
|
||||
json.Unmarshal(body, &result)
|
||||
prettyJSON, _ := json.MarshalIndent(result, "", " ")
|
||||
fmt.Printf("Response:\n%s\n", prettyJSON)
|
||||
}
|
||||
|
||||
// Test 5: PUT - Update signing parties (use different combination if possible)
|
||||
fmt.Println("\n--------------------------------------------")
|
||||
fmt.Println("Test 5: PUT signing-config (Update)")
|
||||
fmt.Println("--------------------------------------------")
|
||||
var updateParties []string
|
||||
if len(activeParties) >= 3 {
|
||||
// If we have 3 parties, use parties 2 and 3 (different combination)
|
||||
updateParties = []string{activeParties[1], activeParties[2]}
|
||||
} else {
|
||||
// Otherwise, reverse the order
|
||||
updateParties = []string{signingParties[1], signingParties[0]}
|
||||
}
|
||||
updateData := map[string]interface{}{
|
||||
"party_ids": updateParties,
|
||||
}
|
||||
fmt.Printf("Updating signing parties to: %v\n", updateParties)
|
||||
status, body, err = makeRequest("PUT", baseURL, updateData, token, apiKey)
|
||||
if err != nil {
|
||||
fmt.Printf("Error: %v\n", err)
|
||||
} else {
|
||||
fmt.Printf("Status: %d\n", status)
|
||||
var result map[string]interface{}
|
||||
json.Unmarshal(body, &result)
|
||||
prettyJSON, _ := json.MarshalIndent(result, "", " ")
|
||||
fmt.Printf("Response:\n%s\n", prettyJSON)
|
||||
}
|
||||
|
||||
// Test 6: GET - Query to verify update
|
||||
fmt.Println("\n--------------------------------------------")
|
||||
fmt.Println("Test 6: GET signing-config (Verify Update)")
|
||||
fmt.Println("--------------------------------------------")
|
||||
status, body, err = makeRequest("GET", baseURL, nil, token, apiKey)
|
||||
if err != nil {
|
||||
fmt.Printf("Error: %v\n", err)
|
||||
} else {
|
||||
fmt.Printf("Status: %d\n", status)
|
||||
var result map[string]interface{}
|
||||
json.Unmarshal(body, &result)
|
||||
prettyJSON, _ := json.MarshalIndent(result, "", " ")
|
||||
fmt.Printf("Response:\n%s\n", prettyJSON)
|
||||
}
|
||||
|
||||
// Test 7: DELETE - Clear signing parties configuration
|
||||
fmt.Println("\n--------------------------------------------")
|
||||
fmt.Println("Test 7: DELETE signing-config (Clear)")
|
||||
fmt.Println("--------------------------------------------")
|
||||
status, body, err = makeRequest("DELETE", baseURL, nil, token, apiKey)
|
||||
if err != nil {
|
||||
fmt.Printf("Error: %v\n", err)
|
||||
} else {
|
||||
fmt.Printf("Status: %d\n", status)
|
||||
var result map[string]interface{}
|
||||
json.Unmarshal(body, &result)
|
||||
prettyJSON, _ := json.MarshalIndent(result, "", " ")
|
||||
fmt.Printf("Response:\n%s\n", prettyJSON)
|
||||
}
|
||||
|
||||
// Test 8: GET - Query to verify cleared
|
||||
fmt.Println("\n--------------------------------------------")
|
||||
fmt.Println("Test 8: GET signing-config (Verify Cleared)")
|
||||
fmt.Println("--------------------------------------------")
|
||||
status, body, err = makeRequest("GET", baseURL, nil, token, apiKey)
|
||||
if err != nil {
|
||||
fmt.Printf("Error: %v\n", err)
|
||||
} else {
|
||||
fmt.Printf("Status: %d\n", status)
|
||||
var result map[string]interface{}
|
||||
json.Unmarshal(body, &result)
|
||||
prettyJSON, _ := json.MarshalIndent(result, "", " ")
|
||||
fmt.Printf("Response:\n%s\n", prettyJSON)
|
||||
}
|
||||
|
||||
// Test 9: DELETE again - Should fail (not configured)
|
||||
fmt.Println("\n--------------------------------------------")
|
||||
fmt.Println("Test 9: DELETE signing-config (Should Fail - Not Configured)")
|
||||
fmt.Println("--------------------------------------------")
|
||||
status, body, err = makeRequest("DELETE", baseURL, nil, token, apiKey)
|
||||
if err != nil {
|
||||
fmt.Printf("Error: %v\n", err)
|
||||
} else {
|
||||
fmt.Printf("Status: %d (expected 404 Not Found)\n", status)
|
||||
var result map[string]interface{}
|
||||
json.Unmarshal(body, &result)
|
||||
prettyJSON, _ := json.MarshalIndent(result, "", " ")
|
||||
fmt.Printf("Response:\n%s\n", prettyJSON)
|
||||
}
|
||||
|
||||
// Test 10: PUT when not configured - Should fail
|
||||
fmt.Println("\n--------------------------------------------")
|
||||
fmt.Println("Test 10: PUT signing-config (Should Fail - Not Configured)")
|
||||
fmt.Println("--------------------------------------------")
|
||||
status, body, err = makeRequest("PUT", baseURL, setData, token, apiKey)
|
||||
if err != nil {
|
||||
fmt.Printf("Error: %v\n", err)
|
||||
} else {
|
||||
fmt.Printf("Status: %d (expected 404 Not Found)\n", status)
|
||||
var result map[string]interface{}
|
||||
json.Unmarshal(body, &result)
|
||||
prettyJSON, _ := json.MarshalIndent(result, "", " ")
|
||||
fmt.Printf("Response:\n%s\n", prettyJSON)
|
||||
}
|
||||
|
||||
fmt.Println("\n===========================================")
|
||||
fmt.Println("All tests completed!")
|
||||
fmt.Println("===========================================")
|
||||
}
|
||||
Loading…
Reference in New Issue