github.com/dcarley/cf-cli@v6.24.1-0.20170220111324-4225ff346898+incompatible/command/request_logger_file_writer_test.go (about)

     1  package command_test
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"io/ioutil"
     7  	"os"
     8  	"path/filepath"
     9  	"time"
    10  
    11  	. "code.cloudfoundry.org/cli/command"
    12  	"code.cloudfoundry.org/cli/util/ui"
    13  
    14  	. "github.com/onsi/ginkgo"
    15  	. "github.com/onsi/gomega"
    16  	. "github.com/onsi/gomega/gbytes"
    17  )
    18  
    19  var _ = Describe("Request Logger File Writer", func() {
    20  	var (
    21  		testUI   *ui.UI
    22  		display  *RequestLoggerFileWriter
    23  		tmpdir   string
    24  		logFile1 string
    25  		logFile2 string
    26  	)
    27  
    28  	BeforeEach(func() {
    29  		testUI = ui.NewTestUI(NewBuffer(), NewBuffer(), NewBuffer())
    30  		var err error
    31  		tmpdir, err = ioutil.TempDir("", "request_logger")
    32  		Expect(err).ToNot(HaveOccurred())
    33  
    34  		logFile1 = filepath.Join(tmpdir, "tmpfile1")
    35  		logFile2 = filepath.Join(tmpdir, "tmpfile2")
    36  		display = NewRequestLoggerFileWriter(testUI, []string{logFile1, logFile2})
    37  		err = display.Start()
    38  		Expect(err).ToNot(HaveOccurred())
    39  	})
    40  
    41  	AfterEach(func() {
    42  		os.RemoveAll(tmpdir)
    43  	})
    44  
    45  	Describe("DisplayBody", func() {
    46  		It("writes the redacted value", func() {
    47  			err := display.DisplayBody([]byte("this is a body"))
    48  			Expect(err).ToNot(HaveOccurred())
    49  
    50  			err = display.Stop()
    51  			Expect(err).ToNot(HaveOccurred())
    52  
    53  			contents, err := ioutil.ReadFile(logFile1)
    54  			Expect(err).ToNot(HaveOccurred())
    55  			Expect(string(contents)).To(Equal(RedactedValue + "\n"))
    56  
    57  			contents, err = ioutil.ReadFile(logFile2)
    58  			Expect(err).ToNot(HaveOccurred())
    59  			Expect(string(contents)).To(Equal(RedactedValue + "\n"))
    60  		})
    61  	})
    62  
    63  	Describe("DisplayJSONBody", func() {
    64  		Context("when provided well formed JSON", func() {
    65  			It("writes a formated output", func() {
    66  				raw := `{"a":"b", "c":"d", "don't escape HTML":"<&>"}`
    67  				formatted := `{
    68    "a": "b",
    69    "c": "d",
    70    "don't escape HTML": "<&>"
    71  }
    72  
    73  ` // Additonal spaces required
    74  				err := display.DisplayJSONBody([]byte(raw))
    75  				Expect(err).ToNot(HaveOccurred())
    76  
    77  				err = display.Stop()
    78  				Expect(err).ToNot(HaveOccurred())
    79  
    80  				contents, err := ioutil.ReadFile(logFile1)
    81  				Expect(err).ToNot(HaveOccurred())
    82  				Expect(string(contents)).To(Equal(formatted))
    83  
    84  				contents, err = ioutil.ReadFile(logFile2)
    85  				Expect(err).ToNot(HaveOccurred())
    86  				Expect(string(contents)).To(Equal(formatted))
    87  			})
    88  		})
    89  
    90  		Context("when the body is empty", func() {
    91  			It("does not write the body", func() {
    92  				err := display.DisplayJSONBody(nil)
    93  				Expect(err).ToNot(HaveOccurred())
    94  
    95  				err = display.Stop()
    96  				Expect(err).ToNot(HaveOccurred())
    97  
    98  				contents, err := ioutil.ReadFile(logFile1)
    99  				Expect(err).ToNot(HaveOccurred())
   100  				// display.Stop() writes "\n" to the file
   101  				Expect(string(contents)).To(Equal("\n"))
   102  
   103  				contents, err = ioutil.ReadFile(logFile2)
   104  				Expect(err).ToNot(HaveOccurred())
   105  				Expect(string(contents)).To(Equal("\n"))
   106  			})
   107  		})
   108  	})
   109  
   110  	Describe("DisplayHeader", func() {
   111  		It("writes the header key and value", func() {
   112  			err := display.DisplayHeader("Header", "Value")
   113  			Expect(err).ToNot(HaveOccurred())
   114  
   115  			err = display.Stop()
   116  			Expect(err).ToNot(HaveOccurred())
   117  
   118  			contents, err := ioutil.ReadFile(logFile1)
   119  			Expect(err).ToNot(HaveOccurred())
   120  			Expect(string(contents)).To(Equal("Header: Value\n\n"))
   121  
   122  			contents, err = ioutil.ReadFile(logFile2)
   123  			Expect(err).ToNot(HaveOccurred())
   124  			Expect(string(contents)).To(Equal("Header: Value\n\n"))
   125  		})
   126  	})
   127  
   128  	Describe("DisplayHost", func() {
   129  		It("writes the host", func() {
   130  			err := display.DisplayHost("banana")
   131  			Expect(err).ToNot(HaveOccurred())
   132  
   133  			err = display.Stop()
   134  			Expect(err).ToNot(HaveOccurred())
   135  
   136  			contents, err := ioutil.ReadFile(logFile1)
   137  			Expect(err).ToNot(HaveOccurred())
   138  			Expect(string(contents)).To(Equal("Host: banana\n\n"))
   139  
   140  			contents, err = ioutil.ReadFile(logFile2)
   141  			Expect(err).ToNot(HaveOccurred())
   142  			Expect(string(contents)).To(Equal("Host: banana\n\n"))
   143  		})
   144  	})
   145  
   146  	Describe("DisplayRequestHeader", func() {
   147  		It("writes the method, uri and http protocal", func() {
   148  			err := display.DisplayRequestHeader("GET", "/v2/spaces/guid/summary", "HTTP/1.1")
   149  			Expect(err).ToNot(HaveOccurred())
   150  
   151  			err = display.Stop()
   152  			Expect(err).ToNot(HaveOccurred())
   153  
   154  			contents, err := ioutil.ReadFile(logFile1)
   155  			Expect(err).ToNot(HaveOccurred())
   156  			Expect(string(contents)).To(Equal("GET /v2/spaces/guid/summary HTTP/1.1\n\n"))
   157  
   158  			contents, err = ioutil.ReadFile(logFile2)
   159  			Expect(err).ToNot(HaveOccurred())
   160  			Expect(string(contents)).To(Equal("GET /v2/spaces/guid/summary HTTP/1.1\n\n"))
   161  		})
   162  	})
   163  
   164  	Describe("DisplayResponseHeader", func() {
   165  		It("writes the method, uri and http protocal", func() {
   166  			err := display.DisplayResponseHeader("HTTP/1.1", "200 OK")
   167  			Expect(err).ToNot(HaveOccurred())
   168  
   169  			err = display.Stop()
   170  			Expect(err).ToNot(HaveOccurred())
   171  
   172  			contents, err := ioutil.ReadFile(logFile1)
   173  			Expect(err).ToNot(HaveOccurred())
   174  			Expect(string(contents)).To(Equal("HTTP/1.1 200 OK\n\n"))
   175  
   176  			contents, err = ioutil.ReadFile(logFile2)
   177  			Expect(err).ToNot(HaveOccurred())
   178  			Expect(string(contents)).To(Equal("HTTP/1.1 200 OK\n\n"))
   179  		})
   180  	})
   181  
   182  	Describe("DisplayType", func() {
   183  		It("writes the passed type and time in localized ISO 8601", func() {
   184  			passedTime := time.Now()
   185  			err := display.DisplayType("banana", passedTime)
   186  			Expect(err).ToNot(HaveOccurred())
   187  
   188  			err = display.Stop()
   189  			Expect(err).ToNot(HaveOccurred())
   190  
   191  			contents, err := ioutil.ReadFile(logFile1)
   192  			Expect(err).ToNot(HaveOccurred())
   193  			Expect(string(contents)).To(Equal(fmt.Sprintf("banana: [%s]\n\n", passedTime.Format(time.RFC3339))))
   194  
   195  			contents, err = ioutil.ReadFile(logFile2)
   196  			Expect(err).ToNot(HaveOccurred())
   197  			Expect(string(contents)).To(Equal(fmt.Sprintf("banana: [%s]\n\n", passedTime.Format(time.RFC3339))))
   198  		})
   199  	})
   200  
   201  	Describe("HandleInternalError", func() {
   202  		It("sends error to standard error", func() {
   203  			err := errors.New("foobar")
   204  			display.HandleInternalError(err)
   205  			Expect(testUI.Err).To(Say("foobar"))
   206  		})
   207  	})
   208  })