github.com/webonyx/up@v0.7.4-0.20180808230834-91b94e551323/config/stages_test.go (about)

     1  package config
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/tj/assert"
     7  )
     8  
     9  func TestStage_Override(t *testing.T) {
    10  	c, err := ParseConfigString(`{
    11  		"name": "app",
    12  		"regions": ["us-west-2"],
    13  		"lambda": {
    14  			"memory": 128
    15  		},
    16  		"hooks": {
    17  			"build": "parcel index.html -o build",
    18  			"clean": "rm -fr build"
    19  		},
    20  		"proxy": {
    21  			"command": "node app.js"
    22  		},
    23  		"stages": {
    24  			"production": {
    25  				"lambda": {
    26  					"memory": 1024
    27  				},
    28  				"hooks": {
    29  					"build": "parcel index.html -o build --production"
    30  				}
    31  			},
    32  			"staging": {
    33  				"proxy": {
    34  					"command": "node app.js --foo=bar"
    35  				}
    36  			}
    37  		}
    38  	}`)
    39  
    40  	assert.NoError(t, err, "parse")
    41  	assert.NoError(t, c.Default(), "default")
    42  	assert.NoError(t, c.Validate(), "validate")
    43  
    44  	assert.NoError(t, c.Override("production"), "override")
    45  	assert.Equal(t, 1024, c.Lambda.Memory)
    46  	assert.Equal(t, Hook{`parcel index.html -o build --production`}, c.Hooks.Build)
    47  	assert.Equal(t, `node app.js`, c.Proxy.Command)
    48  
    49  	assert.NoError(t, c.Override("staging"), "override")
    50  	assert.Equal(t, `node app.js --foo=bar`, c.Proxy.Command)
    51  }
    52  
    53  func TestStages_Default(t *testing.T) {
    54  	t.Run("no custom stages", func(t *testing.T) {
    55  		s := Stages{}
    56  
    57  		assert.NoError(t, s.Default(), "default")
    58  		assert.NoError(t, s.Validate(), "validate")
    59  
    60  		assert.Len(t, s, 3)
    61  		assert.Equal(t, "staging", s["staging"].Name)
    62  		assert.Equal(t, "production", s["production"].Name)
    63  	})
    64  
    65  	t.Run("custom stages", func(t *testing.T) {
    66  		s := Stages{
    67  			"beta": &Stage{},
    68  		}
    69  
    70  		assert.NoError(t, s.Default(), "default")
    71  		assert.NoError(t, s.Validate(), "validate")
    72  
    73  		assert.Len(t, s, 4)
    74  		assert.Equal(t, "beta", s["beta"].Name)
    75  		assert.Equal(t, true, s["beta"].Zone)
    76  	})
    77  }
    78  
    79  func TestStages_Validate(t *testing.T) {
    80  	t.Run("no stages", func(t *testing.T) {
    81  		s := Stages{}
    82  		assert.NoError(t, s.Validate(), "validate")
    83  	})
    84  
    85  	t.Run("some stages", func(t *testing.T) {
    86  		s := Stages{
    87  			"staging": &Stage{
    88  				Domain: "gh-polls-stage.com",
    89  			},
    90  			"production": &Stage{
    91  				Domain: "gh-polls.com",
    92  			},
    93  		}
    94  
    95  		assert.NoError(t, s.Default(), "default")
    96  		assert.NoError(t, s.Validate(), "validate")
    97  		assert.Equal(t, "staging", s["staging"].Name)
    98  		assert.Equal(t, "production", s["production"].Name)
    99  	})
   100  
   101  	t.Run("valid zone boolean", func(t *testing.T) {
   102  		s := Stages{
   103  			"production": &Stage{
   104  				Domain: "gh-polls.com",
   105  				Zone:   false,
   106  			},
   107  		}
   108  
   109  		assert.NoError(t, s.Default(), "default")
   110  		assert.NoError(t, s.Validate(), "validate")
   111  	})
   112  
   113  	t.Run("valid zone string", func(t *testing.T) {
   114  		s := Stages{
   115  			"production": &Stage{
   116  				Domain: "api.gh-polls.com",
   117  				Zone:   "api.gh-polls.com",
   118  			},
   119  		}
   120  
   121  		assert.NoError(t, s.Default(), "default")
   122  		assert.NoError(t, s.Validate(), "validate")
   123  	})
   124  
   125  	t.Run("invalid zone type", func(t *testing.T) {
   126  		s := Stages{
   127  			"production": &Stage{
   128  				Domain: "api.gh-polls.com",
   129  				Zone:   123,
   130  			},
   131  		}
   132  
   133  		assert.NoError(t, s.Default(), "default")
   134  		assert.EqualError(t, s.Validate(), `stage "production": .zone is an invalid type, must be string or boolean`)
   135  	})
   136  }
   137  
   138  func TestStages_List(t *testing.T) {
   139  	stage := &Stage{
   140  		Domain: "gh-polls-stage.com",
   141  	}
   142  
   143  	prod := &Stage{
   144  		Domain: "gh-polls.com",
   145  	}
   146  
   147  	s := Stages{
   148  		"staging":    stage,
   149  		"production": prod,
   150  	}
   151  
   152  	list := []*Stage{
   153  		stage,
   154  		prod,
   155  	}
   156  
   157  	stages := s.List()
   158  	assert.Equal(t, list, stages)
   159  }
   160  
   161  func TestStages_GetByDomain(t *testing.T) {
   162  	stage := &Stage{
   163  		Domain: "gh-polls-stage.com",
   164  	}
   165  
   166  	prod := &Stage{
   167  		Domain: "gh-polls.com",
   168  	}
   169  
   170  	s := Stages{
   171  		"staging":    stage,
   172  		"production": prod,
   173  	}
   174  
   175  	assert.Equal(t, prod, s.GetByDomain("gh-polls.com"))
   176  }