Files
go-unifi/codegen/version_test.go

149 lines
3.9 KiB
Go

package main
import (
"encoding/json"
"fmt"
"net/http"
"net/http/httptest"
"net/url"
"testing"
"github.com/hashicorp/go-version"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func assertLatestVersionUsingProvider(t *testing.T, provider func() (*UnifiVersion, error)) {
t.Helper()
assert := assert.New(t)
require := require.New(t)
fwVersion, err := version.NewVersion("7.3.83+atag-7.3.83-19645")
require.NoError(err)
fwDownload, err := url.Parse("https://fw-download.ubnt.com/data/unifi-controller/c31c-debian-7.3.83-c9249c913b91416693b869b9548850c3.deb")
require.NoError(err)
respData := firmwareUpdateApiResponse{
Embedded: firmwareUpdateApiResponseEmbedded{
Firmware: []firmwareUpdateApiResponseEmbeddedFirmware{
{
Channel: releaseChannel,
Created: "2023-02-06T08:55:31+00:00",
Id: "c9249c91-3b91-4166-93b8-69b9548850c3",
Platform: debianPlatform,
Product: unifiControllerProduct,
Version: fwVersion,
Links: firmwareUpdateApiResponseEmbeddedFirmwareLinks{
Data: firmwareUpdateApiResponseEmbeddedFirmwareDataLink{
Href: fwDownload,
},
},
},
{
Channel: releaseChannel,
Created: "2023-02-06T08:51:36+00:00",
Id: "2a600108-7f79-4b3e-b6e0-4dd262460457",
Platform: "document",
Product: unifiControllerProduct,
Version: fwVersion,
Links: firmwareUpdateApiResponseEmbeddedFirmwareLinks{
Data: firmwareUpdateApiResponseEmbeddedFirmwareDataLink{
Href: nil,
},
},
},
{
Channel: releaseChannel,
Created: "2023-02-06T08:51:37+00:00",
Id: "9d2d413d-36ce-4742-a10d-4351aac6f08d",
Platform: "windows",
Product: unifiControllerProduct,
Version: fwVersion,
Links: firmwareUpdateApiResponseEmbeddedFirmwareLinks{
Data: firmwareUpdateApiResponseEmbeddedFirmwareDataLink{
Href: nil,
},
},
},
},
},
}
server := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
query := req.URL.Query()
assert.Contains(query["filter"], firmwareUpdateApiFilter("channel", releaseChannel))
assert.Contains(query["filter"], firmwareUpdateApiFilter("product", unifiControllerProduct))
resp, err := json.Marshal(respData)
assert.NoError(err)
_, err = rw.Write(resp)
assert.NoError(err)
}))
defer server.Close()
firmwareUpdateApi = server.URL
gotVersion, err := provider()
require.NoError(err)
assert.Equal(fwVersion.Core(), gotVersion.Version)
assert.Equal(fwDownload, gotVersion.DownloadUrl)
}
func TestLatestUnifiVersion(t *testing.T) {
t.Parallel()
assertLatestVersionUsingProvider(t, func() (*UnifiVersion, error) {
return latestUnifiVersion()
})
}
func TestDetermineUnifiVersion_latest(t *testing.T) {
t.Parallel()
assertLatestVersionUsingProvider(t, func() (*UnifiVersion, error) {
return determineUnifiVersion(LatestVersionMarker)
})
}
func TestDetermineUnifiVersion_provided(t *testing.T) {
t.Parallel()
testCases := map[string]string{
"7.3.83+atag-7.3.83-19645": "7.3.83",
"7.3.83": "7.3.83",
"7.3": "7.3.0",
"7": "7.0.0",
}
for providedVersion, expectedVersion := range testCases {
t.Run(providedVersion, func(t *testing.T) {
t.Parallel()
assert := assert.New(t)
require := require.New(t)
unifiVersion, err := determineUnifiVersion(providedVersion)
require.NoError(err)
assert.Equal(expectedVersion, unifiVersion.Version.String())
assert.Equal(fmt.Sprintf(baseDownloadUrl, expectedVersion), unifiVersion.DownloadUrl.String())
})
}
}
func TestDetermineUnifiVersion_invalid(t *testing.T) {
t.Parallel()
testCases := []string{
"invalid",
"-1",
"",
}
assert := assert.New(t)
for _, providedVersion := range testCases {
t.Run(providedVersion, func(t *testing.T) {
t.Parallel()
_, err := determineUnifiVersion(providedVersion)
assert.ErrorContains(err, providedVersion)
})
}
}