github.com/jasonkeene/cli@v6.14.1-0.20160816203908-ca5715166dfb+incompatible/utils/json/json_parser_test.go (about)

     1  package json_test
     2  
     3  import (
     4  	"io/ioutil"
     5  	"os"
     6  
     7  	"github.com/cloudfoundry/cli/utils/json"
     8  	. "github.com/onsi/ginkgo"
     9  	. "github.com/onsi/gomega"
    10  )
    11  
    12  var _ = Describe("JSON Parser", func() {
    13  	Describe("ParseJSONArray", func() {
    14  		var filename string
    15  		var tmpFile *os.File
    16  
    17  		Context("when everything is proper", func() {
    18  			BeforeEach(func() {
    19  				tmpFile, _ = ioutil.TempFile("", "WONDERFULFILEWHOSENAMEISHARDTOREADBUTCONTAINSVALIDJSON")
    20  				filename = tmpFile.Name()
    21  				ioutil.WriteFile(filename, []byte("[{\"akey\": \"avalue\"}]"), 0644)
    22  			})
    23  
    24  			AfterEach(func() {
    25  				tmpFile.Close()
    26  				os.Remove(tmpFile.Name())
    27  			})
    28  
    29  			It("converts a json file into an unmarshalled slice of string->string map objects", func() {
    30  				stringMaps, err := json.ParseJSONArray(filename)
    31  				Expect(err).To(BeNil())
    32  				Expect(stringMaps[0]["akey"]).To(Equal("avalue"))
    33  			})
    34  		})
    35  
    36  		Context("when the JSON is invalid", func() {
    37  			BeforeEach(func() {
    38  				tmpFile, _ = ioutil.TempFile("", "TERRIBLEFILECONTAININGINVALIDJSONWHICHMAKESEVERYTHINGTERRIBLEANDSTILLHASANAMETHATSHARDTOREAD")
    39  				filename = tmpFile.Name()
    40  				ioutil.WriteFile(filename, []byte("SCARY NOISES}"), 0644)
    41  			})
    42  
    43  			AfterEach(func() {
    44  				tmpFile.Close()
    45  				os.Remove(tmpFile.Name())
    46  			})
    47  
    48  			It("tries to convert the json file but fails because it was given something it didn't like", func() {
    49  				_, err := json.ParseJSONArray(filename)
    50  				Expect(err).To(MatchError("Incorrect json format: invalid character 'S' looking for beginning of value"))
    51  			})
    52  		})
    53  	})
    54  
    55  	Describe("ParseJSONFromFileOrString", func() {
    56  		Context("when the input is empty", func() {
    57  			It("returns nil", func() {
    58  				result, err := json.ParseJSONFromFileOrString("")
    59  
    60  				Expect(result).To(BeNil())
    61  				Expect(err).To(BeNil())
    62  			})
    63  		})
    64  
    65  		Context("when the input is a file", func() {
    66  			var jsonFile *os.File
    67  			var fileContent string
    68  
    69  			AfterEach(func() {
    70  				if jsonFile != nil {
    71  					jsonFile.Close()
    72  					os.Remove(jsonFile.Name())
    73  				}
    74  			})
    75  
    76  			BeforeEach(func() {
    77  				fileContent = `{"foo": "bar"}`
    78  			})
    79  
    80  			JustBeforeEach(func() {
    81  				var err error
    82  				jsonFile, err = ioutil.TempFile("", "")
    83  				Expect(err).ToNot(HaveOccurred())
    84  
    85  				err = ioutil.WriteFile(jsonFile.Name(), []byte(fileContent), os.ModePerm)
    86  				Expect(err).NotTo(HaveOccurred())
    87  			})
    88  
    89  			It("returns the parsed json from the file", func() {
    90  				result, err := json.ParseJSONFromFileOrString(jsonFile.Name())
    91  				Expect(err).NotTo(HaveOccurred())
    92  
    93  				Expect(result).To(Equal(map[string]interface{}{"foo": "bar"}))
    94  			})
    95  
    96  			Context("when the file contains invalid json", func() {
    97  				BeforeEach(func() {
    98  					fileContent = `badtimes`
    99  				})
   100  
   101  				It("returns an error", func() {
   102  					_, err := json.ParseJSONFromFileOrString(jsonFile.Name())
   103  					Expect(err).To(MatchError("Incorrect json format: invalid character 'b' looking for beginning of value"))
   104  				})
   105  			})
   106  		})
   107  
   108  		Context("when the input is considered a json string (when it is not a file path)", func() {
   109  			var jsonString string
   110  
   111  			BeforeEach(func() {
   112  				jsonString = `{"foo": "bar"}`
   113  			})
   114  
   115  			It("returns the parsed json", func() {
   116  				result, err := json.ParseJSONFromFileOrString(jsonString)
   117  				Expect(err).NotTo(HaveOccurred())
   118  
   119  				Expect(result).To(Equal(map[string]interface{}{"foo": "bar"}))
   120  			})
   121  
   122  			Context("when the JSON is invalid", func() {
   123  				BeforeEach(func() {
   124  					jsonString = "SOMETHING IS WRONG"
   125  				})
   126  
   127  				It("returns a json parse error", func() {
   128  					_, err := json.ParseJSONFromFileOrString(jsonString)
   129  					Expect(err).To(MatchError("Incorrect json format: invalid character 'S' looking for beginning of value"))
   130  				})
   131  			})
   132  		})
   133  
   134  		Context("when the input is neither a file nor a json string", func() {
   135  			var invalidInput string
   136  
   137  			BeforeEach(func() {
   138  				invalidInput = "boo"
   139  			})
   140  
   141  			It("returns an error", func() {
   142  				_, err := json.ParseJSONFromFileOrString(invalidInput)
   143  				Expect(err).To(HaveOccurred())
   144  			})
   145  		})
   146  	})
   147  })