github.com/rakutentech/cli@v6.12.5-0.20151006231303-24468b65536e+incompatible/cf/manifest/generate_manifest_test.go (about)

     1  package manifest_test
     2  
     3  import (
     4  	"io/ioutil"
     5  	"os"
     6  	"strings"
     7  
     8  	. "github.com/cloudfoundry/cli/cf/manifest"
     9  	. "github.com/cloudfoundry/cli/testhelpers/matchers"
    10  	. "github.com/onsi/ginkgo"
    11  	. "github.com/onsi/gomega"
    12  )
    13  
    14  type outputs struct {
    15  	contents []string
    16  	cursor   int
    17  }
    18  
    19  var _ = Describe("generate_manifest", func() {
    20  	var (
    21  		m   AppManifest
    22  		err error
    23  	)
    24  
    25  	BeforeEach(func() {
    26  		_, err = os.Stat("./output.yml")
    27  		Ω(err).To(HaveOccurred())
    28  
    29  		m = NewGenerator()
    30  		m.FileSavePath("./output.yml")
    31  	})
    32  
    33  	AfterEach(func() {
    34  		err = os.Remove("./output.yml")
    35  		Ω(err).ToNot(HaveOccurred())
    36  	})
    37  
    38  	It("creates a new file at a given path", func() {
    39  		m.Save()
    40  
    41  		_, err = os.Stat("./output.yml")
    42  		Ω(err).ToNot(HaveOccurred())
    43  	})
    44  
    45  	It("starts the manifest with 3 dashes (---), followed by 'applications'", func() {
    46  		m.Save()
    47  
    48  		contents := getYamlContent("./output.yml")
    49  
    50  		Ω(contents[0]).To(Equal("---"))
    51  		Ω(contents[1]).To(Equal("applications:"))
    52  	})
    53  
    54  	It("creates entry under the given app name", func() {
    55  		m.Memory("app1", 128)
    56  		m.Memory("app2", 64)
    57  		m.Save()
    58  
    59  		//outputs.ContainSubstring assert orders
    60  		cmdOutput := &outputs{
    61  			contents: getYamlContent("./output.yml"),
    62  			cursor:   0,
    63  		}
    64  
    65  		Ω(cmdOutput.ContainsSubstring("- name: app1")).To(BeTrue())
    66  		Ω(cmdOutput.ContainsSubstring("  memory: 128M")).To(BeTrue())
    67  
    68  		Ω(cmdOutput.ContainsSubstring("- name: app2")).To(BeTrue())
    69  		Ω(cmdOutput.ContainsSubstring("  memory: 64M")).To(BeTrue())
    70  	})
    71  
    72  	It("prefixes each service with '-'", func() {
    73  		m.Service("app1", "service1")
    74  		m.Service("app1", "service2")
    75  		m.Service("app1", "service3")
    76  		m.Save()
    77  
    78  		contents := getYamlContent("./output.yml")
    79  
    80  		Ω(contents).To(ContainSubstrings(
    81  			[]string{"  services:"},
    82  			[]string{"- service1"},
    83  			[]string{"- service2"},
    84  			[]string{"- service3"},
    85  		))
    86  	})
    87  
    88  	It("generates a manifest containing all the attributes", func() {
    89  		m.Memory("app1", 128)
    90  		m.StartCommand("app1", "run main.go")
    91  		m.Service("app1", "service1")
    92  		m.EnvironmentVars("app1", "foo", "boo")
    93  		m.HealthCheckTimeout("app1", 100)
    94  		m.Instances("app1", 3)
    95  		m.Domain("app1", "foo", "blahblahblah.com")
    96  		m.BuildpackUrl("app1", "ruby-buildpack")
    97  		err := m.Save()
    98  		Ω(err).NotTo(HaveOccurred())
    99  
   100  		Ω(getYamlContent("./output.yml")).To(ContainSubstrings(
   101  			[]string{"- name: app1"},
   102  			[]string{"  memory: 128M"},
   103  			[]string{"  command: run main.go"},
   104  			[]string{"  services:"},
   105  			[]string{"  - service1"},
   106  			[]string{"  env:"},
   107  			[]string{"    foo: boo"},
   108  			[]string{"  timeout: 100"},
   109  			[]string{"  instances: 3"},
   110  			[]string{"  host: foo"},
   111  			[]string{"  domain: blahblahblah.com"},
   112  			[]string{"  buildpack: ruby-buildpack"},
   113  		))
   114  	})
   115  	Context("When there are multiple hosts and domains", func() {
   116  
   117  		It("generates a manifest containing two hosts two domains", func() {
   118  			m.Memory("app1", 128)
   119  			m.StartCommand("app1", "run main.go")
   120  			m.Service("app1", "service1")
   121  			m.EnvironmentVars("app1", "foo", "boo")
   122  			m.HealthCheckTimeout("app1", 100)
   123  			m.Instances("app1", 3)
   124  			m.Domain("app1", "foo1", "test1.com")
   125  			m.Domain("app1", "foo1", "test2.com")
   126  			m.Domain("app1", "foo2", "test1.com")
   127  			m.Domain("app1", "foo2", "test2.com")
   128  			m.BuildpackUrl("app1", "ruby-buildpack")
   129  			err := m.Save()
   130  			Ω(err).NotTo(HaveOccurred())
   131  
   132  			Ω(getYamlContent("./output.yml")).To(ContainSubstrings(
   133  				[]string{"- name: app1"},
   134  				[]string{"  memory: 128M"},
   135  				[]string{"  command: run main.go"},
   136  				[]string{"  services:"},
   137  				[]string{"  - service1"},
   138  				[]string{"  env:"},
   139  				[]string{"    foo: boo"},
   140  				[]string{"  timeout: 100"},
   141  				[]string{"  instances: 3"},
   142  				[]string{"  hosts:"},
   143  				[]string{"  - foo1"},
   144  				[]string{"  - foo2"},
   145  				[]string{"  domains:"},
   146  				[]string{"  - test1.com"},
   147  				[]string{"  - test2.com"},
   148  				[]string{"  buildpack: ruby-buildpack"},
   149  			))
   150  		})
   151  	})
   152  
   153  	Context("When there are multiple hosts and single domain", func() {
   154  
   155  		It("generates a manifest containing two hosts one domain", func() {
   156  			m.Memory("app1", 128)
   157  			m.StartCommand("app1", "run main.go")
   158  			m.Service("app1", "service1")
   159  			m.EnvironmentVars("app1", "foo", "boo")
   160  			m.HealthCheckTimeout("app1", 100)
   161  			m.Instances("app1", 3)
   162  			m.Domain("app1", "foo1", "test.com")
   163  			m.Domain("app1", "foo2", "test.com")
   164  			m.BuildpackUrl("app1", "ruby-buildpack")
   165  			err := m.Save()
   166  			Ω(err).NotTo(HaveOccurred())
   167  
   168  			Ω(getYamlContent("./output.yml")).To(ContainSubstrings(
   169  				[]string{"- name: app1"},
   170  				[]string{"  memory: 128M"},
   171  				[]string{"  command: run main.go"},
   172  				[]string{"  services:"},
   173  				[]string{"  - service1"},
   174  				[]string{"  env:"},
   175  				[]string{"    foo: boo"},
   176  				[]string{"  timeout: 100"},
   177  				[]string{"  instances: 3"},
   178  				[]string{"  hosts:"},
   179  				[]string{"  - foo1"},
   180  				[]string{"  - foo2"},
   181  				[]string{"  domain: test.com"},
   182  				[]string{"  buildpack: ruby-buildpack"},
   183  			))
   184  		})
   185  	})
   186  
   187  	Context("When there is single host and multiple domains", func() {
   188  
   189  		It("generates a manifest containing one host two domains", func() {
   190  			m.Memory("app1", 128)
   191  			m.StartCommand("app1", "run main.go")
   192  			m.Service("app1", "service1")
   193  			m.EnvironmentVars("app1", "foo", "boo")
   194  			m.HealthCheckTimeout("app1", 100)
   195  			m.Instances("app1", 3)
   196  			m.Domain("app1", "foo", "test1.com")
   197  			m.Domain("app1", "foo", "test2.com")
   198  			m.BuildpackUrl("app1", "ruby-buildpack")
   199  			err := m.Save()
   200  			Ω(err).NotTo(HaveOccurred())
   201  
   202  			Ω(getYamlContent("./output.yml")).To(ContainSubstrings(
   203  				[]string{"- name: app1"},
   204  				[]string{"  memory: 128M"},
   205  				[]string{"  command: run main.go"},
   206  				[]string{"  services:"},
   207  				[]string{"  - service1"},
   208  				[]string{"  env:"},
   209  				[]string{"    foo: boo"},
   210  				[]string{"  timeout: 100"},
   211  				[]string{"  instances: 3"},
   212  				[]string{"  host: foo"},
   213  				[]string{"  domains:"},
   214  				[]string{"  - test1.com"},
   215  				[]string{"  - test2.com"},
   216  				[]string{"  buildpack: ruby-buildpack"},
   217  			))
   218  		})
   219  	})
   220  
   221  })
   222  
   223  func getYamlContent(path string) []string {
   224  	b, err := ioutil.ReadFile(path)
   225  	Ω(err).ToNot(HaveOccurred())
   226  
   227  	return strings.Split(string(b), "\n")
   228  }
   229  
   230  func (o *outputs) ContainsSubstring(str string) bool {
   231  	for i := o.cursor; i < len(o.contents)-1; i++ {
   232  		if strings.Contains(o.contents[i], str) {
   233  			o.cursor = i
   234  			return true
   235  		}
   236  	}
   237  	return false
   238  }