github.com/keybase/client/go@v0.0.0-20241007131713-f10651d043c8/kbnm/handler_test.go (about)

     1  package main
     2  
     3  import (
     4  	"io"
     5  	"os/exec"
     6  	"strings"
     7  	"testing"
     8  )
     9  
    10  func TestHandlerChat(t *testing.T) {
    11  	h := newHandler()
    12  
    13  	var ranCmd string
    14  	h.Run = func(cmd *exec.Cmd) error {
    15  		ranCmd = strings.Join(cmd.Args, " ")
    16  		return nil
    17  	}
    18  	h.FindKeybaseBinary = func() (string, error) {
    19  		return "/mocked/test/path/keybase", nil
    20  	}
    21  
    22  	req := &Request{
    23  		Method: "chat",
    24  		Body:   "test message",
    25  		To:     "testkeybaseuser",
    26  	}
    27  
    28  	if _, err := h.Handle(req); err != nil {
    29  		t.Errorf("request failed: %q", err)
    30  	}
    31  
    32  	if ranCmd != "/mocked/test/path/keybase chat send --private testkeybaseuser" {
    33  		t.Errorf("unexpected command: %q", ranCmd)
    34  	}
    35  }
    36  
    37  const queryResponse = `[INFO] 001 Identifying sometestuser
    38  ✔ public key fingerprint: 9FCE A980 CCFD 3C13 E11E 88A9 3506 87D1 7E81 FD68
    39  ✔ admin of sometestuser.net via HTTPS: https://sometestuser.net/keybase.txt
    40  ✔ "sometestuser" on github: https://gist.github.com/10763855
    41  ✔ "sometestuser" on twitter: https://twitter.com/sometestuser/status/456154521052274689 [cached 2017-04-06 10:20:10 EDT]
    42  ✔ "sometestuser" on hackernews: https://news.ycombinator.com/user?id=sometestuser [cached 2017-04-06 10:20:09 EDT]
    43  ✔ "sometestuser" on reddit: https://www.reddit.com/r/KeybaseProofs/comments/2o8dbv/my_keybase_proof_redditsometestuser_keybasesometestuser/ [cached 2017-04-06 10:20:10 EDT]
    44  `
    45  
    46  const queryResponseErr = `[ERRO] 001 Not found
    47  `
    48  
    49  const queryResponseErrUnexpected = `[INFO] 001 Random progress message
    50  [ERRO] 002 Something unexpected happened
    51  `
    52  
    53  func TestHandlerQueryError(t *testing.T) {
    54  	h := newHandler()
    55  
    56  	var ranCmd string
    57  	h.Run = func(cmd *exec.Cmd) error {
    58  		ranCmd = strings.Join(cmd.Args, " ")
    59  		_ = ranCmd
    60  		_, err := io.WriteString(cmd.Stderr, queryResponseErr)
    61  		return err
    62  	}
    63  	h.FindKeybaseBinary = func() (string, error) {
    64  		return "/mocked/test/path/keybase", nil
    65  	}
    66  
    67  	req := &Request{
    68  		Method: "query",
    69  		To:     "doesnotexist",
    70  	}
    71  
    72  	_, err := h.Handle(req)
    73  	if err == nil {
    74  		t.Fatal("request succeeded when failure was expected")
    75  	}
    76  
    77  	if got, want := err.Error(), "user not found"; got != want {
    78  		t.Errorf("incorrect error; got: %q, want %q", got, want)
    79  	}
    80  }
    81  
    82  func TestHandlerQueryErrorUnexpected(t *testing.T) {
    83  	h := newHandler()
    84  
    85  	var ranCmd string
    86  	h.Run = func(cmd *exec.Cmd) error {
    87  		ranCmd = strings.Join(cmd.Args, " ")
    88  		_ = ranCmd
    89  		_, err := io.WriteString(cmd.Stderr, queryResponseErrUnexpected)
    90  		return err
    91  	}
    92  	h.FindKeybaseBinary = func() (string, error) {
    93  		return "/mocked/test/path/keybase", nil
    94  	}
    95  
    96  	req := &Request{
    97  		Method: "query",
    98  		To:     "doesnotexist",
    99  	}
   100  
   101  	_, err := h.Handle(req)
   102  	if err == nil {
   103  		t.Fatal("request succeeded when failure was expected")
   104  	}
   105  
   106  	if got, want := err.Error(), "unexpected error: Something unexpected happened"; got != want {
   107  		t.Errorf("incorrect error; got: %q, want %q", got, want)
   108  	}
   109  }
   110  
   111  func TestHandlerQuery(t *testing.T) {
   112  	h := newHandler()
   113  
   114  	var ranCmd string
   115  	h.Run = func(cmd *exec.Cmd) error {
   116  		ranCmd = strings.Join(cmd.Args, " ")
   117  		_, err := io.WriteString(cmd.Stderr, queryResponse)
   118  		return err
   119  	}
   120  	h.FindKeybaseBinary = func() (string, error) {
   121  		return "/mocked/test/path/keybase", nil
   122  	}
   123  
   124  	req := &Request{
   125  		Method: "query",
   126  		To:     "sometestuser",
   127  	}
   128  
   129  	res, err := h.Handle(req)
   130  	if err != nil {
   131  		t.Errorf("request failed: %q", err)
   132  	}
   133  	result, ok := res.(*resultQuery)
   134  	if !ok {
   135  		t.Errorf("result is not *resultQuery: %T", res)
   136  	}
   137  
   138  	if ranCmd != "/mocked/test/path/keybase id sometestuser" {
   139  		t.Errorf("unexpected command: %q", ranCmd)
   140  	}
   141  
   142  	if result == nil {
   143  		t.Fatal("result is nil")
   144  	}
   145  
   146  	if result.Username != "sometestuser" {
   147  		t.Errorf("invalid result value: %q", result)
   148  	}
   149  }
   150  
   151  func TestCleanCmdArg(t *testing.T) {
   152  	testcases := []struct {
   153  		Input string
   154  		Err   error
   155  	}{
   156  		{"shazow@reddit", nil},
   157  		{"shazow:twitter.com", nil},
   158  		{`abcABC123_@.`, nil},
   159  		{``, errMissingField},
   160  		{`a-bc${foo} bar`, errInvalidInput},
   161  		{"foo\nbar", errInvalidInput},
   162  		{"foo ", errInvalidInput},
   163  	}
   164  
   165  	for i, test := range testcases {
   166  		if _, err := checkUsernameQuery(test.Input); err != test.Err {
   167  			t.Errorf("case %d: got %q; want %q", i, err, test.Err)
   168  		}
   169  	}
   170  }