debian-forge-composer/internal/target/targetresult_test.go
Sanne Raymaekers 111feda1f5 worker: Remove ellipsis operator from clienterrors.Error
The ellipsis operator was used as a hack to not need to pass any details
as an argument, but it makes what the end object will actually look like
less obvious. It also makes it impossible to pass an array to details
without getting a nested array.

Fixes #2874
2022-08-03 13:51:52 +02:00

113 lines
3.1 KiB
Go

package target
import (
"encoding/json"
"fmt"
"testing"
"github.com/osbuild/osbuild-composer/internal/worker/clienterrors"
"github.com/stretchr/testify/assert"
)
// Test that `Filename` set in the `Target` options gets set also in the
// `Target.ExportFilename`.
// This covers the case when new worker receives a job from old composer.
// This covers the case when new worker receives a job from new composer.
func TestTargetResultUnmarshal(t *testing.T) {
testCases := []struct {
resultJSON []byte
expectedResult *TargetResult
err bool
}{
{
resultJSON: []byte(`{"name":"org.osbuild.aws","options":{"ami":"ami-123456789","region":"eu"}}`),
expectedResult: &TargetResult{
Name: TargetNameAWS,
Options: &AWSTargetResultOptions{
Ami: "ami-123456789",
Region: "eu",
},
},
},
{
resultJSON: []byte(`{"name":"org.osbuild.aws.s3","options":{"url":"https://example.org/image"}}`),
expectedResult: &TargetResult{
Name: TargetNameAWSS3,
Options: &AWSS3TargetResultOptions{
URL: "https://example.org/image",
},
},
},
{
resultJSON: []byte(`{"name":"org.osbuild.gcp","options":{"image_name":"image","project_id":"project"}}`),
expectedResult: &TargetResult{
Name: TargetNameGCP,
Options: &GCPTargetResultOptions{
ImageName: "image",
ProjectID: "project",
},
},
},
{
resultJSON: []byte(`{"name":"org.osbuild.azure.image","options":{"image_name":"image"}}`),
expectedResult: &TargetResult{
Name: TargetNameAzureImage,
Options: &AzureImageTargetResultOptions{
ImageName: "image",
},
},
},
{
resultJSON: []byte(`{"name":"org.osbuild.koji","options":{"image_md5":"hash","image_size":123456}}`),
expectedResult: &TargetResult{
Name: TargetNameKoji,
Options: &KojiTargetResultOptions{
ImageMD5: "hash",
ImageSize: 123456,
},
},
},
{
resultJSON: []byte(`{"name":"org.osbuild.oci","options":{"region":"eu","image_id":"image"}}`),
expectedResult: &TargetResult{
Name: TargetNameOCI,
Options: &OCITargetResultOptions{
Region: "eu",
ImageID: "image",
},
},
},
{
resultJSON: []byte(`{"name":"org.osbuild.vmware"}`),
expectedResult: &TargetResult{
Name: TargetNameVMWare,
},
},
// target results with error without options
{
resultJSON: []byte(`{"name":"org.osbuild.aws","target_error":{"id":11,"reason":"failed to uplad image","details":"detail"}}`),
expectedResult: &TargetResult{
Name: TargetNameAWS,
TargetError: clienterrors.WorkerClientError(clienterrors.ErrorUploadingImage, "failed to uplad image", "detail"),
},
},
// unknown target name
{
resultJSON: []byte(`{"name":"org.osbuild.made.up.target","options":{}}`),
err: true,
},
}
for idx, testCase := range testCases {
t.Run(fmt.Sprintf("Case #%d", idx), func(t *testing.T) {
gotResult := TargetResult{}
err := json.Unmarshal(testCase.resultJSON, &gotResult)
if testCase.err {
assert.Error(t, err)
} else {
assert.NoError(t, err)
assert.EqualValues(t, testCase.expectedResult, &gotResult)
}
})
}
}