github.com/section/sectionctl@v1.12.3/commands/login_test.go (about)

     1  package commands
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"net/http"
     7  	"net/http/httptest"
     8  	"net/url"
     9  	"strings"
    10  	"testing"
    11  
    12  	"github.com/section/sectionctl/api"
    13  	"github.com/section/sectionctl/credentials"
    14  	"github.com/stretchr/testify/assert"
    15  	"github.com/zalando/go-keyring"
    16  )
    17  
    18  func TestCommandsLoginValidatesGoodCredentials(t *testing.T) {
    19  	assert := assert.New(t)
    20  	keyring.MockInit()
    21  
    22  	// Setup
    23  	var called bool
    24  	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    25  		called = true
    26  		w.WriteHeader(http.StatusOK)
    27  		fmt.Fprint(w, "{}")
    28  	}))
    29  
    30  	ur, err := url.Parse(ts.URL)
    31  	assert.NoError(err)
    32  	api.PrefixURI = ur
    33  
    34  	in := strings.NewReader("s3cr3t\n")
    35  	var out bytes.Buffer
    36  	cmd := LoginCmd{
    37  		in:  in,
    38  		out: &out,
    39  	}
    40  
    41  	// Invoke
    42  	err = cmd.Run()
    43  
    44  	// Test
    45  	assert.NoError(err)
    46  	assert.True(called)
    47  }
    48  
    49  func TestCommandsLoginValidatesBadCredentials(t *testing.T) {
    50  	assert := assert.New(t)
    51  	keyring.MockInit()
    52  
    53  	// Setup
    54  	var called bool
    55  	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    56  		called = true
    57  		w.WriteHeader(http.StatusUnauthorized)
    58  	}))
    59  
    60  	ur, err := url.Parse(ts.URL)
    61  	assert.NoError(err)
    62  	api.PrefixURI = ur
    63  
    64  	in := strings.NewReader("s3cr3t\n")
    65  	var out bytes.Buffer
    66  	cmd := LoginCmd{
    67  		in:  in,
    68  		out: &out,
    69  	}
    70  
    71  	// Invoke
    72  	err = cmd.Run()
    73  
    74  	// Test
    75  	assert.Error(err)
    76  	assert.True(called)
    77  	assert.Contains(err.Error(), "unauthorized")
    78  }
    79  
    80  func TestCommandsLoginUsesAlreadySetAPIToken(t *testing.T) {
    81  	assert := assert.New(t)
    82  	keyring.MockInit()
    83  	api.Token = "s3cr3t-" + t.Name()
    84  
    85  	// Setup
    86  	var called bool
    87  	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    88  		called = true
    89  		token := r.Header.Get("section-token")
    90  		if assert.Equal(token, api.Token) {
    91  			w.WriteHeader(http.StatusOK)
    92  			fmt.Fprint(w, "{}")
    93  		} else {
    94  			w.WriteHeader(http.StatusBadRequest)
    95  		}
    96  	}))
    97  
    98  	ur, err := url.Parse(ts.URL)
    99  	assert.NoError(err)
   100  	api.PrefixURI = ur
   101  
   102  	cmd := LoginCmd{
   103  		in:  &bytes.Buffer{},
   104  		out: &bytes.Buffer{},
   105  	}
   106  
   107  
   108  	// Invoke
   109  	err = cmd.Run()
   110  
   111  	// Test
   112  	assert.NoError(err)
   113  	assert.True(called)
   114  
   115  	c, err := credentials.Read(api.PrefixURI.Host)
   116  	assert.NoError(err)
   117  	assert.Equal(c, api.Token)
   118  }