From 7c988bf0c7a735d742b543737f70ace902376c90 Mon Sep 17 00:00:00 2001
From: Niall Sheridan <nsheridan@gmail.com>
Date: Tue, 19 Apr 2016 22:28:56 +0100
Subject: [PATCH] Client tests

---
 client/client_test.go | 99 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 99 insertions(+)
 create mode 100644 client/client_test.go

diff --git a/client/client_test.go b/client/client_test.go
new file mode 100644
index 00000000..7cb1184b
--- /dev/null
+++ b/client/client_test.go
@@ -0,0 +1,99 @@
+package main
+
+import (
+	"bytes"
+	"crypto/rand"
+	"crypto/rsa"
+	"encoding/json"
+	"fmt"
+	"net/http"
+	"net/http/httptest"
+	"testing"
+
+	"github.com/nsheridan/cashier/lib"
+	"github.com/nsheridan/cashier/testdata"
+
+	"golang.org/x/crypto/ssh"
+	"golang.org/x/crypto/ssh/agent"
+)
+
+func TestLoadCert(t *testing.T) {
+	priv, _ := ssh.ParseRawPrivateKey(testdata.Priv)
+	key := priv.(*rsa.PrivateKey)
+	pub, _ := ssh.NewPublicKey(&key.PublicKey)
+	c := &ssh.Certificate{
+		Key:         pub,
+		CertType:    ssh.UserCert,
+		ValidBefore: ssh.CertTimeInfinity,
+		ValidAfter:  0,
+	}
+	signer, err := ssh.NewSignerFromKey(key)
+	if err != nil {
+		t.Fatal(err)
+	}
+	c.SignCert(rand.Reader, signer)
+	a := agent.NewKeyring()
+	if err := installCert(a, c, key); err != nil {
+		t.Fatal(err)
+	}
+	listedKeys, err := a.List()
+	if err != nil {
+		t.Fatalf("Error reading from agent: %v", err)
+	}
+	if len(listedKeys) != 1 {
+		t.Fatalf("Expected 1 key, got %d", len(listedKeys))
+	}
+	if !bytes.Equal(listedKeys[0].Marshal(), c.Marshal()) {
+		t.Fatal("Certs not equal")
+	}
+}
+
+func TestSignGood(t *testing.T) {
+	res := &lib.SignResponse{
+		Status:   "ok",
+		Response: string(testdata.Cert),
+	}
+	j, _ := json.Marshal(res)
+	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+		fmt.Fprintln(w, string(j))
+	}))
+	defer ts.Close()
+	*url = ts.URL
+	_, err := send([]byte(`{}`), "token")
+	if err != nil {
+		t.Fatal(err)
+	}
+	k, _, _, _, err := ssh.ParseAuthorizedKey(testdata.Pub)
+	if err != nil {
+		t.Fatal(err)
+	}
+	cert, err := sign(k, "token")
+	if cert == nil && err != nil {
+		t.Fatal(err)
+	}
+}
+
+func TestSignBad(t *testing.T) {
+	res := &lib.SignResponse{
+		Status:   "error",
+		Response: `{"response": "error"}`,
+	}
+	j, _ := json.Marshal(res)
+	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+		fmt.Fprintln(w, string(j))
+	}))
+	defer ts.Close()
+	*url = ts.URL
+	_, err := send([]byte(`{}`), "token")
+	if err != nil {
+		t.Fatal(err)
+	}
+	k, _, _, _, err := ssh.ParseAuthorizedKey(testdata.Pub)
+	if err != nil {
+		t.Fatal(err)
+	}
+	cert, err := sign(k, "token")
+	if cert != nil && err == nil {
+		t.Fatal(err)
+	}
+}
-- 
GitLab