- Native Windows daemon using TCP loopback endpoints - Direct-mode fallback for CLI/daemon compatibility - Comment operations over RPC - PowerShell installer script - Go 1.24 requirement - Cross-OS testing documented Co-authored-by: danshapiro <danshapiro@users.noreply.github.com> Amp-Thread-ID: https://ampcode.com/threads/T-c6230265-055f-4af1-9712-4481061886db Co-authored-by: Amp <amp@ampcode.com>
173 lines
3.8 KiB
Go
173 lines
3.8 KiB
Go
package rpc
|
|
|
|
import (
|
|
"encoding/json"
|
|
"testing"
|
|
)
|
|
|
|
func TestRequestSerialization(t *testing.T) {
|
|
createArgs := CreateArgs{
|
|
Title: "Test Issue",
|
|
Description: "Test description",
|
|
IssueType: "task",
|
|
Priority: 2,
|
|
}
|
|
|
|
argsJSON, err := json.Marshal(createArgs)
|
|
if err != nil {
|
|
t.Fatalf("Failed to marshal args: %v", err)
|
|
}
|
|
|
|
req := Request{
|
|
Operation: OpCreate,
|
|
Args: argsJSON,
|
|
}
|
|
|
|
reqJSON, err := json.Marshal(req)
|
|
if err != nil {
|
|
t.Fatalf("Failed to marshal request: %v", err)
|
|
}
|
|
|
|
var decodedReq Request
|
|
if err := json.Unmarshal(reqJSON, &decodedReq); err != nil {
|
|
t.Fatalf("Failed to unmarshal request: %v", err)
|
|
}
|
|
|
|
if decodedReq.Operation != OpCreate {
|
|
t.Errorf("Expected operation %s, got %s", OpCreate, decodedReq.Operation)
|
|
}
|
|
|
|
var decodedArgs CreateArgs
|
|
if err := json.Unmarshal(decodedReq.Args, &decodedArgs); err != nil {
|
|
t.Fatalf("Failed to unmarshal args: %v", err)
|
|
}
|
|
|
|
if decodedArgs.Title != createArgs.Title {
|
|
t.Errorf("Expected title %s, got %s", createArgs.Title, decodedArgs.Title)
|
|
}
|
|
if decodedArgs.Priority != createArgs.Priority {
|
|
t.Errorf("Expected priority %d, got %d", createArgs.Priority, decodedArgs.Priority)
|
|
}
|
|
}
|
|
|
|
func TestResponseSerialization(t *testing.T) {
|
|
resp := Response{
|
|
Success: true,
|
|
Data: json.RawMessage(`{"id":"bd-1","title":"Test"}`),
|
|
}
|
|
|
|
respJSON, err := json.Marshal(resp)
|
|
if err != nil {
|
|
t.Fatalf("Failed to marshal response: %v", err)
|
|
}
|
|
|
|
var decodedResp Response
|
|
if err := json.Unmarshal(respJSON, &decodedResp); err != nil {
|
|
t.Fatalf("Failed to unmarshal response: %v", err)
|
|
}
|
|
|
|
if decodedResp.Success != resp.Success {
|
|
t.Errorf("Expected success %v, got %v", resp.Success, decodedResp.Success)
|
|
}
|
|
|
|
if string(decodedResp.Data) != string(resp.Data) {
|
|
t.Errorf("Expected data %s, got %s", string(resp.Data), string(decodedResp.Data))
|
|
}
|
|
}
|
|
|
|
func TestErrorResponse(t *testing.T) {
|
|
resp := Response{
|
|
Success: false,
|
|
Error: "something went wrong",
|
|
}
|
|
|
|
respJSON, err := json.Marshal(resp)
|
|
if err != nil {
|
|
t.Fatalf("Failed to marshal response: %v", err)
|
|
}
|
|
|
|
var decodedResp Response
|
|
if err := json.Unmarshal(respJSON, &decodedResp); err != nil {
|
|
t.Fatalf("Failed to unmarshal response: %v", err)
|
|
}
|
|
|
|
if decodedResp.Success {
|
|
t.Errorf("Expected success false, got true")
|
|
}
|
|
|
|
if decodedResp.Error != resp.Error {
|
|
t.Errorf("Expected error %s, got %s", resp.Error, decodedResp.Error)
|
|
}
|
|
}
|
|
|
|
func TestAllOperations(t *testing.T) {
|
|
operations := []string{
|
|
OpPing,
|
|
OpCreate,
|
|
OpUpdate,
|
|
OpClose,
|
|
OpList,
|
|
OpShow,
|
|
OpReady,
|
|
OpStats,
|
|
OpDepAdd,
|
|
OpDepRemove,
|
|
OpDepTree,
|
|
OpLabelAdd,
|
|
OpLabelRemove,
|
|
OpCommentList,
|
|
OpCommentAdd,
|
|
}
|
|
|
|
for _, op := range operations {
|
|
req := Request{
|
|
Operation: op,
|
|
Args: json.RawMessage(`{}`),
|
|
}
|
|
|
|
reqJSON, err := json.Marshal(req)
|
|
if err != nil {
|
|
t.Errorf("Failed to marshal request for op %s: %v", op, err)
|
|
continue
|
|
}
|
|
|
|
var decodedReq Request
|
|
if err := json.Unmarshal(reqJSON, &decodedReq); err != nil {
|
|
t.Errorf("Failed to unmarshal request for op %s: %v", op, err)
|
|
continue
|
|
}
|
|
|
|
if decodedReq.Operation != op {
|
|
t.Errorf("Expected operation %s, got %s", op, decodedReq.Operation)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestUpdateArgsWithNilValues(t *testing.T) {
|
|
title := "New Title"
|
|
args := UpdateArgs{
|
|
ID: "bd-1",
|
|
Title: &title,
|
|
}
|
|
|
|
argsJSON, err := json.Marshal(args)
|
|
if err != nil {
|
|
t.Fatalf("Failed to marshal args: %v", err)
|
|
}
|
|
|
|
var decodedArgs UpdateArgs
|
|
if err := json.Unmarshal(argsJSON, &decodedArgs); err != nil {
|
|
t.Fatalf("Failed to unmarshal args: %v", err)
|
|
}
|
|
|
|
if decodedArgs.Title == nil {
|
|
t.Errorf("Expected title to be non-nil")
|
|
} else if *decodedArgs.Title != title {
|
|
t.Errorf("Expected title %s, got %s", title, *decodedArgs.Title)
|
|
}
|
|
|
|
if decodedArgs.Status != nil {
|
|
t.Errorf("Expected status to be nil, got %v", *decodedArgs.Status)
|
|
}
|
|
}
|