internal/output/json/json_test.go

package json

import (
	"bytes"
	stdjson "encoding/json"
	"testing"
	"time"

	"github.com/mercemay/portr/internal/check"
	"github.com/mercemay/portr/internal/check/result"
	"github.com/mercemay/portr/internal/config/target"
)

func TestWrite_roundtrip(t *testing.T) {
	rep := check.Report{
		Started:  time.Unix(1645000000, 0).UTC(),
		Finished: time.Unix(1645000001, 0).UTC(),
		Results: []result.Result{
			result.Success(target.Target{Host: "h", Port: 22}, 5*time.Millisecond, 1),
			result.Failure(target.Target{Host: "h", Port: 80}, nil, 0, 2),
		},
	}
	var buf bytes.Buffer
	if err := New(false).Write(&buf, rep); err != nil {
		t.Fatalf("Write: %v", err)
	}
	var got struct {
		Open    int `json:"open"`
		Closed  int `json:"closed"`
		Results []struct {
			Open bool `json:"open"`
		} `json:"results"`
	}
	if err := stdjson.Unmarshal(buf.Bytes(), &got); err != nil {
		t.Fatalf("unmarshal: %v", err)
	}
	if got.Open != 1 || got.Closed != 1 {
		t.Errorf("open=%d closed=%d, want 1/1", got.Open, got.Closed)
	}
	if len(got.Results) != 2 {
		t.Errorf("results len=%d, want 2", len(got.Results))
	}
}

func TestWrite_pretty(t *testing.T) {
	var buf bytes.Buffer
	_ = New(true).Write(&buf, check.Report{})
	if !bytes.Contains(buf.Bytes(), []byte("  ")) {
		t.Errorf("pretty output missing indent: %s", buf.String())
	}
}