package model

import (
	"github.com/tech/sendico/pkg/discovery"
	"testing"
)

func TestNormalizeRailOperations(t *testing.T) {
	ops := NormalizeRailOperations([]RailOperation{
		"send",
		"SEND",
		" external_credit ",
		"unknown",
		"",
	})
	if len(ops) != 2 {
		t.Fatalf("unexpected operations count: got=%d want=2", len(ops))
	}
	if ops[0] != discovery.RailOperationSend {
		t.Fatalf("unexpected first operation: got=%q want=%q", ops[0], discovery.RailOperationSend)
	}
	if ops[1] != discovery.RailOperationExternalCredit {
		t.Fatalf("unexpected second operation: got=%q want=%q", ops[1], discovery.RailOperationExternalCredit)
	}
}

func TestHasRailOperation(t *testing.T) {
	ops := []RailOperation{discovery.RailOperationSend, discovery.RailOperationExternalCredit}
	if !HasRailOperation(ops, discovery.RailOperationSend) {
		t.Fatalf("expected send operation to be present")
	}
	if !HasRailOperation(ops, " external_credit ") {
		t.Fatalf("expected external credit operation to be present")
	}
	if HasRailOperation(ops, discovery.RailOperationObserveConfirm) {
		t.Fatalf("did not expect observe confirm operation to be present")
	}
}

func TestRailCapabilitiesFromOperations(t *testing.T) {
	cap := RailCapabilitiesFromOperations([]RailOperation{
		discovery.RailOperationExternalDebit,
		discovery.RailOperationExternalCredit,
		discovery.RailOperationFee,
		discovery.RailOperationObserveConfirm,
		discovery.RailOperationBlock,
		discovery.RailOperationRelease,
	})

	if !cap.CanPayIn {
		t.Fatalf("expected can pay in to be true")
	}
	if !cap.CanPayOut {
		t.Fatalf("expected can pay out to be true")
	}
	if !cap.CanSendFee {
		t.Fatalf("expected can send fee to be true")
	}
	if !cap.RequiresObserveConfirm {
		t.Fatalf("expected requires observe confirm to be true")
	}
	if !cap.CanBlock {
		t.Fatalf("expected can block to be true")
	}
	if !cap.CanRelease {
		t.Fatalf("expected can release to be true")
	}
}
