cwp_test.go 3.6 KB
Newer Older
1 2 3 4 5
package cmd

import (
	"bytes"
	"github.com/golang/mock/gomock"
6
	"github.com/jenkins-zh/jenkins-cli/app/cmd/common"
7
	"github.com/jenkins-zh/jenkins-cli/client"
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
	"github.com/jenkins-zh/jenkins-cli/mock/mhttp"
	"github.com/jenkins-zh/jenkins-cli/util"
	. "github.com/onsi/ginkgo"
	. "github.com/onsi/gomega"
	"github.com/stretchr/testify/assert"
	"io/ioutil"
	"net/http"
	"os"
	"path"
	"testing"
)

var _ = Describe("cwp command test", func() {
	var (
		ctrl       *gomock.Controller
		localCache string
	)

	BeforeEach(func() {
		ctrl = gomock.NewController(GinkgoT())
		localCache = os.TempDir()
		roundTripper := mhttp.NewMockRoundTripper(ctrl)
		cwpOptions = CWPOptions{
31
			CommonOption: common.CommonOption{RoundTripper: roundTripper},
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
			MetadataURL:  "http://localhost/maven-metadata.xml",
			LocalCache:   localCache,
		}
		prepareMavenMetadataRequest(roundTripper)

		fakeContent := "hello"
		prepareDownloadFileRequest(cwpOptions.GetCWPURL("2.0-alpha-2"), fakeContent, roundTripper)

		cwpOptions.SystemCallExec = util.FakeSystemCallExecSuccess
		cwpOptions.LookPathContext = util.FakeLookPath
	})

	AfterEach(func() {
		os.RemoveAll(localCache)
		ctrl.Finish()
	})

	Context("basic test", func() {
		It("should success", func() {
			rootCmd.SetArgs([]string{"cwp"})
			_, err := rootCmd.ExecuteC()
			Expect(err).NotTo(HaveOccurred())
		})
	})
})

func TestDownload(t *testing.T) {
	ctrl := gomock.NewController(t)

	tmpDir := os.TempDir()
	defer os.RemoveAll(tmpDir)

	roundTripper := mhttp.NewMockRoundTripper(ctrl)
	cwpOpts := CWPOptions{
66
		CommonOption: common.CommonOption{RoundTripper: roundTripper},
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
		MetadataURL:  "http://localhost/maven-metadata.xml",
		LocalCache:   tmpDir,
	}
	prepareMavenMetadataRequest(roundTripper)

	fakeContent := "hello"
	prepareDownloadFileRequest(cwpOpts.GetCWPURL("2.0-alpha-2"), fakeContent, roundTripper)

	err := cwpOpts.Download()
	assert.Nil(t, err)

	var data []byte
	data, err = ioutil.ReadFile(path.Join(tmpDir, "cwp-cli.jar"))
	assert.Nil(t, err)
	assert.Equal(t, fakeContent, string(data))
}

func TestGetLatest(t *testing.T) {
	ctrl := gomock.NewController(t)

	roundTripper := mhttp.NewMockRoundTripper(ctrl)
	cwpOpts := CWPOptions{
89
		CommonOption: common.CommonOption{RoundTripper: roundTripper},
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
		MetadataURL:  "http://localhost/maven-metadata.xml",
	}
	prepareMavenMetadataRequest(roundTripper)

	ver, err := cwpOpts.GetLatest()
	assert.Nil(t, err)
	assert.Equal(t, "2.0-alpha-2", ver)
}

func prepareDownloadFileRequest(url, content string, roundTripper *mhttp.MockRoundTripper) {
	request, _ := http.NewRequest("GET", url, nil)
	response := &http.Response{
		StatusCode: 200,
		Request:    request,
		Body:       ioutil.NopCloser(bytes.NewBufferString(content)),
	}
	roundTripper.EXPECT().
107
		RoundTrip(client.NewRequestMatcher(request)).Return(response, nil)
108 109 110 111 112 113 114 115 116 117
}

func prepareMavenMetadataRequest(roundTripper *mhttp.MockRoundTripper) {
	request, _ := http.NewRequest("GET", "http://localhost/maven-metadata.xml", nil)
	response := &http.Response{
		StatusCode: 200,
		Request:    request,
		Body:       ioutil.NopCloser(bytes.NewBufferString(getMavenMetadataSample())),
	}
	roundTripper.EXPECT().
118
		RoundTrip(client.NewRequestMatcher(request)).Return(response, nil)
119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
}

func getMavenMetadataSample() string {
	return `<?xml version="1.0" encoding="UTF-8"?>
<metadata>
  <groupId>io.jenkins.tools.custom-war-packager</groupId>
  <artifactId>custom-war-packager-cli</artifactId>
  <versioning>
    <latest>2.0-alpha-2</latest>
    <release>2.0-alpha-2</release>
    <versions>
      <version>2.0-alpha-2</version>
	</versions>
    <lastUpdated>20190815083928</lastUpdated>
  </versioning>
</metadata>`
}