github.phpd.cn/goreleaser/goreleaser@v0.92.0/internal/pipe/snapcraft/snapcraft_test.go (about)

     1  package snapcraft
     2  
     3  import (
     4  	"fmt"
     5  	"io/ioutil"
     6  	"os"
     7  	"path/filepath"
     8  	"testing"
     9  
    10  	"github.com/goreleaser/goreleaser/internal/artifact"
    11  	"github.com/goreleaser/goreleaser/internal/pipe"
    12  	"github.com/goreleaser/goreleaser/pkg/config"
    13  	"github.com/goreleaser/goreleaser/pkg/context"
    14  	"github.com/stretchr/testify/assert"
    15  	yaml "gopkg.in/yaml.v2"
    16  )
    17  
    18  func TestDescription(t *testing.T) {
    19  	assert.NotEmpty(t, Pipe{}.String())
    20  }
    21  
    22  func TestRunPipeMissingInfo(t *testing.T) {
    23  	for eerr, snap := range map[error]config.Snapcraft{
    24  		ErrNoSummary: {
    25  			Description: "dummy desc",
    26  		},
    27  		ErrNoDescription: {
    28  			Summary: "dummy summary",
    29  		},
    30  		pipe.Skip("no summary nor description were provided"): {},
    31  	} {
    32  		t.Run(fmt.Sprintf("testing if %v happens", eerr), func(t *testing.T) {
    33  			var ctx = &context.Context{
    34  				Config: config.Project{
    35  					Snapcraft: snap,
    36  				},
    37  			}
    38  			assert.Equal(t, eerr, Pipe{}.Run(ctx))
    39  		})
    40  	}
    41  }
    42  
    43  func TestRunPipe(t *testing.T) {
    44  	folder, err := ioutil.TempDir("", "archivetest")
    45  	assert.NoError(t, err)
    46  	var dist = filepath.Join(folder, "dist")
    47  	assert.NoError(t, os.Mkdir(dist, 0755))
    48  	assert.NoError(t, err)
    49  	var ctx = context.New(config.Project{
    50  		ProjectName: "mybin",
    51  		Dist:        dist,
    52  		Snapcraft: config.Snapcraft{
    53  			NameTemplate: "foo_{{.Arch}}",
    54  			Summary:      "test summary",
    55  			Description:  "test description",
    56  			Publish:      true,
    57  		},
    58  	})
    59  	ctx.Git.CurrentTag = "v1.2.3"
    60  	ctx.Version = "v1.2.3"
    61  	addBinaries(t, ctx, "mybin", dist)
    62  	assert.NoError(t, Pipe{}.Run(ctx))
    63  	assert.Len(t, ctx.Artifacts.Filter(artifact.ByType(artifact.PublishableSnapcraft)).List(), 2)
    64  }
    65  
    66  func TestRunPipeInvalidNameTemplate(t *testing.T) {
    67  	folder, err := ioutil.TempDir("", "archivetest")
    68  	assert.NoError(t, err)
    69  	var dist = filepath.Join(folder, "dist")
    70  	assert.NoError(t, os.Mkdir(dist, 0755))
    71  	assert.NoError(t, err)
    72  	var ctx = context.New(config.Project{
    73  		ProjectName: "mybin",
    74  		Dist:        dist,
    75  		Snapcraft: config.Snapcraft{
    76  			NameTemplate: "foo_{{.Arch}",
    77  			Summary:      "test summary",
    78  			Description:  "test description",
    79  		},
    80  	})
    81  	ctx.Git.CurrentTag = "v1.2.3"
    82  	ctx.Version = "v1.2.3"
    83  	addBinaries(t, ctx, "mybin", dist)
    84  	assert.EqualError(t, Pipe{}.Run(ctx), `template: tmpl:1: unexpected "}" in operand`)
    85  }
    86  
    87  func TestRunPipeWithName(t *testing.T) {
    88  	folder, err := ioutil.TempDir("", "archivetest")
    89  	assert.NoError(t, err)
    90  	var dist = filepath.Join(folder, "dist")
    91  	assert.NoError(t, os.Mkdir(dist, 0755))
    92  	assert.NoError(t, err)
    93  	var ctx = context.New(config.Project{
    94  		ProjectName: "testprojectname",
    95  		Dist:        dist,
    96  		Snapcraft: config.Snapcraft{
    97  			NameTemplate: "foo_{{.Arch}}",
    98  			Name:         "testsnapname",
    99  			Summary:      "test summary",
   100  			Description:  "test description",
   101  		},
   102  	})
   103  	ctx.Git.CurrentTag = "v1.2.3"
   104  	ctx.Version = "v1.2.3"
   105  	addBinaries(t, ctx, "testprojectname", dist)
   106  	assert.NoError(t, Pipe{}.Run(ctx))
   107  	yamlFile, err := ioutil.ReadFile(filepath.Join(dist, "foo_amd64", "prime", "meta", "snap.yaml"))
   108  	assert.NoError(t, err)
   109  	var metadata Metadata
   110  	err = yaml.Unmarshal(yamlFile, &metadata)
   111  	assert.NoError(t, err)
   112  	assert.Equal(t, metadata.Name, "testsnapname")
   113  	assert.Equal(t, metadata.Apps["mybin"].Command, "mybin")
   114  	assert.Equal(t, metadata.Apps["testsnapname"].Command, "mybin")
   115  }
   116  
   117  func TestRunPipeMetadata(t *testing.T) {
   118  	folder, err := ioutil.TempDir("", "archivetest")
   119  	assert.NoError(t, err)
   120  	var dist = filepath.Join(folder, "dist")
   121  	assert.NoError(t, os.Mkdir(dist, 0755))
   122  	assert.NoError(t, err)
   123  	var ctx = context.New(config.Project{
   124  		ProjectName: "testprojectname",
   125  		Dist:        dist,
   126  		Snapcraft: config.Snapcraft{
   127  			NameTemplate: "foo_{{.Arch}}",
   128  			Summary:      "test summary",
   129  			Description:  "test description",
   130  			Apps: map[string]config.SnapcraftAppMetadata{
   131  				"mybin": {
   132  					Plugs:  []string{"home", "network"},
   133  					Daemon: "simple",
   134  					Args:   "--foo --bar",
   135  				},
   136  			},
   137  		},
   138  	})
   139  	ctx.Git.CurrentTag = "v1.2.3"
   140  	ctx.Version = "v1.2.3"
   141  	addBinaries(t, ctx, "mybin", dist)
   142  	assert.NoError(t, Pipe{}.Run(ctx))
   143  	yamlFile, err := ioutil.ReadFile(filepath.Join(dist, "foo_amd64", "prime", "meta", "snap.yaml"))
   144  	assert.NoError(t, err)
   145  	var metadata Metadata
   146  	err = yaml.Unmarshal(yamlFile, &metadata)
   147  	assert.NoError(t, err)
   148  	assert.Equal(t, metadata.Apps["mybin"].Plugs, []string{"home", "network"})
   149  	assert.Equal(t, metadata.Apps["mybin"].Daemon, "simple")
   150  	assert.Equal(t, metadata.Apps["mybin"].Command, "mybin --foo --bar")
   151  	assert.Equal(t, metadata.Apps["testprojectname"].Plugs, []string{"home", "network"})
   152  	assert.Equal(t, metadata.Apps["testprojectname"].Daemon, "simple")
   153  	assert.Equal(t, metadata.Apps["testprojectname"].Command, "mybin --foo --bar")
   154  }
   155  
   156  func TestNoSnapcraftInPath(t *testing.T) {
   157  	var path = os.Getenv("PATH")
   158  	defer func() {
   159  		assert.NoError(t, os.Setenv("PATH", path))
   160  	}()
   161  	assert.NoError(t, os.Setenv("PATH", ""))
   162  	var ctx = context.New(config.Project{
   163  		Snapcraft: config.Snapcraft{
   164  			Summary:     "dummy",
   165  			Description: "dummy",
   166  		},
   167  	})
   168  	assert.EqualError(t, Pipe{}.Run(ctx), ErrNoSnapcraft.Error())
   169  }
   170  
   171  func TestDefault(t *testing.T) {
   172  	var ctx = context.New(config.Project{})
   173  	assert.NoError(t, Pipe{}.Default(ctx))
   174  	assert.Equal(t, defaultNameTemplate, ctx.Config.Snapcraft.NameTemplate)
   175  }
   176  
   177  func TestPublish(t *testing.T) {
   178  	var ctx = context.New(config.Project{})
   179  	ctx.Artifacts.Add(artifact.Artifact{
   180  		Name:   "mybin",
   181  		Path:   "nope.snap",
   182  		Goarch: "amd64",
   183  		Goos:   "linux",
   184  		Type:   artifact.PublishableSnapcraft,
   185  	})
   186  	err := Pipe{}.Publish(ctx)
   187  	assert.Contains(t, err.Error(), "failed to push nope.snap package")
   188  }
   189  
   190  func TestDefaultSet(t *testing.T) {
   191  	var ctx = context.New(config.Project{
   192  		Snapcraft: config.Snapcraft{
   193  			NameTemplate: "foo",
   194  		},
   195  	})
   196  	assert.NoError(t, Pipe{}.Default(ctx))
   197  	assert.Equal(t, "foo", ctx.Config.Snapcraft.NameTemplate)
   198  }
   199  
   200  func addBinaries(t *testing.T, ctx *context.Context, name, dist string) {
   201  	for _, goos := range []string{"linux", "darwin"} {
   202  		for _, goarch := range []string{"amd64", "386", "arm6"} {
   203  			var folder = goos + goarch
   204  			assert.NoError(t, os.Mkdir(filepath.Join(dist, folder), 0755))
   205  			var binPath = filepath.Join(dist, folder, name)
   206  			_, err := os.Create(binPath)
   207  			assert.NoError(t, err)
   208  			ctx.Artifacts.Add(artifact.Artifact{
   209  				Name:   "mybin",
   210  				Path:   binPath,
   211  				Goarch: goarch,
   212  				Goos:   goos,
   213  				Type:   artifact.Binary,
   214  			})
   215  		}
   216  	}
   217  }