grim/convey

closing merged branch
hostnames
2017-10-13, Gary Kramlich
33eae19fcbbe
closing merged branch
/*
* Convey
* Copyright 2016-2017 Gary Kramlich <grim@reaperworld.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package convey
import (
"fmt"
"bitbucket.org/rw_grim/convey/docker"
"github.com/aphistic/sweet"
. "github.com/onsi/gomega"
cConfig "bitbucket.org/rw_grim/convey/config"
)
// This test suite tests
type extendsSuite struct{}
func (d *extendsSuite) TestNoClash(t sweet.T) {
baseData := `
environment:
- x=1
- y=2
- z=3
tasks:
foo:
image: imaginary1
bar:
image: imaginary2
baz:
image: imaginary3
plans:
plan1:
stages:
- tasks: [foo, bar, baz]
`
extendedData := `
extends: base.yaml
environment:
- w=4
tasks:
bonk:
image: imaginary4
plans:
plan2:
stages:
- tasks: [foo, bonk]
`
loader := &Loader{
fileLoader: func(name string, c *Loader) (*cConfig.Config, error) {
return c.Load(".", name, []byte(baseData))
},
}
cfg, err := loader.Load(".", ".", []byte(extendedData))
Expect(err).To(BeNil())
Expect(cfg.Environment).To(ConsistOf([]string{"x=1", "y=2", "z=3", "w=4"}))
Expect(cfg.Tasks).To(HaveLen(4))
Expect(cfg.Tasks).To(HaveKey("foo"))
Expect(cfg.Tasks).To(HaveKey("bar"))
Expect(cfg.Tasks).To(HaveKey("baz"))
Expect(cfg.Tasks).To(HaveKey("bonk"))
Expect(cfg.Plans).To(HaveLen(2))
Expect(cfg.Plans).To(HaveKey("plan1"))
Expect(cfg.Plans).To(HaveKey("plan2"))
}
func (d *extendsSuite) TestExtendsAndOverwrite(t sweet.T) {
baseData := `
environment:
- x=1
- y=2
- z=3
tasks:
foo:
image: imaginary1
bar:
image: imaginary2
baz:
image: imaginary3
plans:
plan1:
stages:
- tasks: [foo, bar, baz]
`
extendedData := `
extends: base.yaml
environment:
- z=4
tasks:
baz:
image: imaginary4
plans:
plan1:
stages:
- tasks: [foo, baz]
`
loader := &Loader{
fileLoader: func(name string, c *Loader) (*cConfig.Config, error) {
return c.Load(".", name, []byte(baseData))
},
}
cfg, err := loader.Load(".", ".", []byte(extendedData))
Expect(err).To(BeNil())
Expect(cfg.Environment).To(ConsistOf([]string{"x=1", "y=2", "z=4"}))
Expect(cfg.Tasks).To(HaveLen(3))
Expect(cfg.Tasks).To(HaveKey("foo"))
Expect(cfg.Tasks).To(HaveKey("bar"))
Expect(cfg.Tasks).To(HaveKey("baz"))
Expect(cfg.Plans).To(HaveLen(1))
Expect(cfg.Plans).To(HaveKey("plan1"))
Expect(cfg.Tasks["baz"].(*docker.Run).Image).To(Equal("imaginary4"))
Expect(cfg.Plans["plan1"].Stages[0].Tasks).To(BeEquivalentTo([]string{"foo", "baz"}))
}
func (d *extendsSuite) TestExtendDefault(t sweet.T) {
baseData := `
options:
default-plan: plan1
tasks:
foo:
image: imaginary1
plans:
plan1:
stages:
- tasks: [foo]
`
extendedData := `
extends: base.yaml
options:
default-plan: plan2
tasks:
bar:
image: imaginary1
plans:
plan2:
stages:
- tasks: [bar]
`
loader := &Loader{
fileLoader: func(name string, c *Loader) (*cConfig.Config, error) {
return c.Load(".", name, []byte(baseData))
},
}
_, err := loader.Load(".", ".", []byte(extendedData))
Expect(err).To(BeNil())
Expect(loader.defaultPlan).To(Equal("plan2"))
}
func (d *extendsSuite) TestExtendTasksOnly(t sweet.T) {
baseData := `
options:
default-plan: plan1
tasks:
foo:
image: imaginary1
`
extendedData := `
extends: base.yaml
plans:
plan:
stages:
- tasks: [foo]
`
loader := &Loader{
fileLoader: func(name string, c *Loader) (*cConfig.Config, error) {
return c.Load(".", name, []byte(baseData))
},
}
cfg, err := loader.Load(".", ".", []byte(extendedData))
Expect(err).To(BeNil())
Expect(cfg.Tasks).To(HaveLen(1))
Expect(cfg.Tasks).To(HaveKey("foo"))
Expect(cfg.Plans).To(HaveLen(1))
Expect(cfg.Plans).To(HaveKey("plan"))
}
func (d *extendsSuite) TestExtendNoTasks(t sweet.T) {
baseData := ``
extendedData := `extends: base.yml`
loader := &Loader{
fileLoader: func(name string, c *Loader) (*cConfig.Config, error) {
return c.Load(".", name, []byte(baseData))
},
}
_, err := loader.Load(".", ".", []byte(extendedData))
Expect(err).To(Equal(ErrNoTasks))
}
func (d *extendsSuite) TestExtendNoPlans(t sweet.T) {
baseData := `
options:
default-plan: plan1
tasks:
foo:
image: imaginary1
`
extendedData := `extends: base.yaml`
loader := &Loader{
fileLoader: func(name string, c *Loader) (*cConfig.Config, error) {
return c.Load(".", name, []byte(baseData))
},
}
cfg, err := loader.Load(".", ".", []byte(extendedData))
Expect(err).To(Equal(ErrNoPlans))
Expect(cfg.Tasks).To(HaveLen(1))
Expect(cfg.Tasks).To(HaveKey("foo"))
}
func (d *extendsSuite) TestLoop(t sweet.T) {
sameData := `
extends: convey.yaml
`
loader := &Loader{
fileLoader: func(name string, c *Loader) (*cConfig.Config, error) {
return c.Load(".", name, []byte(sameData))
},
}
_, err := loader.Load(".", ".", []byte(sameData))
Expect(err).To(Equal(ErrMaxExtendsDepth))
}
func (d *extendsSuite) TestFilename(t sweet.T) {
data := `
extends: ../base.yaml
`
calledWith := ""
loader := &Loader{
fileLoader: func(name string, c *Loader) (*cConfig.Config, error) {
calledWith = name
return nil, fmt.Errorf("early out")
},
}
loader.Load(".", ".", []byte(data))
Expect(calledWith).To(Equal("../base.yaml"))
}