Skip to content
Snippets Groups Projects
Commit 0f7047ad authored by Lyuben Penkovski's avatar Lyuben Penkovski
Browse files

Unit tests for exporting policy bundle

parent a59c7e79
No related branches found
No related tags found
No related merge requests found
package policy
import (
"archive/zip"
"bytes"
"encoding/json"
"io"
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"gitlab.eclipse.org/eclipse/xfsc/tsa/policy/internal/storage"
)
// should not be modified, read only
var testPolicy = &storage.Policy{
Repository: "myrepo",
Name: "mypolicy",
Group: "example",
Version: "1.0",
Rego: "package test",
Data: `{"hello":"static data"}`,
DataConfig: `{"cfg":"static data config"}`,
Locked: true,
LastUpdate: time.Date(2023, 11, 7, 1, 0, 0, 0, time.UTC),
}
var testMetadata = Metadata{
Policy: struct {
Name string `json:"name"`
Group string `json:"group"`
Version string `json:"version"`
Repository string `json:"repository"`
Locked bool `json:"locked"`
LastUpdate time.Time `json:"lastUpdate"`
}{
Name: "mypolicy",
Group: "example",
Version: "1.0",
Repository: "myrepo",
Locked: true,
LastUpdate: time.Date(2023, 11, 7, 1, 0, 0, 0, time.UTC),
},
}
func TestPolicy_createPolicyBundle(t *testing.T) {
bundle, err := createPolicyBundle(testPolicy)
assert.NoError(t, err)
assert.NotNil(t, bundle)
reader, err := zip.NewReader(bytes.NewReader(bundle), int64(len(bundle)))
assert.NoError(t, err)
assert.NotNil(t, reader)
// check metadata
require.NotNil(t, reader.File[0])
require.Equal(t, "metadata.json", reader.File[0].Name)
metaFile, err := reader.File[0].Open()
require.NoError(t, err)
var meta Metadata
err = json.NewDecoder(metaFile).Decode(&meta)
require.NoError(t, err)
assert.Equal(t, testMetadata, meta)
// check policy source code
assert.NotNil(t, reader.File[1])
assert.Equal(t, "policy.rego", reader.File[1].Name)
sourceFile, err := reader.File[1].Open()
require.NoError(t, err)
source, err := io.ReadAll(sourceFile)
require.NoError(t, err)
assert.Equal(t, "package test", string(source))
// check static data
assert.NotNil(t, reader.File[2])
assert.Equal(t, "data.json", reader.File[2].Name)
dataFile, err := reader.File[2].Open()
require.NoError(t, err)
data, err := io.ReadAll(dataFile)
require.NoError(t, err)
assert.Equal(t, `{"hello":"static data"}`, string(data))
// check static data configuration
assert.NotNil(t, reader.File[3])
assert.Equal(t, "data-config.json", reader.File[3].Name)
dataConfigFile, err := reader.File[3].Open()
require.NoError(t, err)
dataConfig, err := io.ReadAll(dataConfigFile)
require.NoError(t, err)
assert.Equal(t, `{"cfg":"static data config"}`, string(dataConfig))
}
package policy_test package policy_test
import ( import (
"archive/zip"
"bytes"
"context" "context"
"fmt" "fmt"
"io"
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
"testing" "testing"
"time" "time"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.uber.org/zap" "go.uber.org/zap"
"gitlab.eclipse.org/eclipse/xfsc/tsa/golib/errors" "gitlab.eclipse.org/eclipse/xfsc/tsa/golib/errors"
...@@ -881,3 +885,90 @@ func TestService_SubscribeForPolicyChange(t *testing.T) { ...@@ -881,3 +885,90 @@ func TestService_SubscribeForPolicyChange(t *testing.T) {
}) })
} }
} }
func TestService_ExportBundle(t *testing.T) {
t.Run("policy not found in storage", func(t *testing.T) {
storage := &policyfakes.FakeStorage{
PolicyStub: func(ctx context.Context, s string, s2 string, s3 string, s4 string) (*storage.Policy, error) {
return nil, errors.New(errors.NotFound, "policy not found")
},
}
svc := policy.New(storage, nil, nil, zap.NewNop())
res, reader, err := svc.ExportBundle(context.Background(), &goapolicy.ExportBundleRequest{})
assert.Nil(t, res)
assert.Nil(t, reader)
require.Error(t, err)
assert.ErrorContains(t, err, "policy not found")
e, ok := err.(*errors.Error)
assert.True(t, ok)
assert.True(t, errors.Is(errors.NotFound, e))
})
t.Run("error getting policy from storage", func(t *testing.T) {
storage := &policyfakes.FakeStorage{
PolicyStub: func(ctx context.Context, s string, s2 string, s3 string, s4 string) (*storage.Policy, error) {
return nil, errors.New("unexpected error")
},
}
svc := policy.New(storage, nil, nil, zap.NewNop())
res, reader, err := svc.ExportBundle(context.Background(), &goapolicy.ExportBundleRequest{})
assert.Nil(t, res)
assert.Nil(t, reader)
require.Error(t, err)
assert.ErrorContains(t, err, "unexpected error")
e, ok := err.(*errors.Error)
assert.True(t, ok)
assert.True(t, errors.Is(errors.Unknown, e))
})
t.Run("successful export of policy bundle", func(t *testing.T) {
storage := &policyfakes.FakeStorage{
PolicyStub: func(ctx context.Context, s string, s2 string, s3 string, s4 string) (*storage.Policy, error) {
return &storage.Policy{
Repository: "myrepo",
Name: "myname",
Group: "mygroup",
Version: "1.52",
Rego: "package test",
Data: `{"key":"value"}`,
DataConfig: `{"new":"value"}`,
Locked: false,
LastUpdate: time.Date(2023, 10, 8, 0, 0, 0, 0, time.UTC),
}, nil
},
}
svc := policy.New(storage, nil, nil, zap.NewNop())
res, reader, err := svc.ExportBundle(context.Background(), &goapolicy.ExportBundleRequest{})
require.NoError(t, err)
require.NotNil(t, res)
require.NotNil(t, reader)
assert.Equal(t, "application/zip", res.ContentType)
assert.Equal(t, `attachment; filename="myrepo_mygroup_myname_1.52.zip"`, res.ContentDisposition)
assert.NotZero(t, res.ContentLength)
archive, err := io.ReadAll(reader)
require.NoError(t, err)
require.NotNil(t, archive)
r, err := zip.NewReader(bytes.NewReader(archive), int64(res.ContentLength))
require.NoError(t, err)
require.NotNil(t, r)
// check metadata
require.NotNil(t, r.File[0])
require.Equal(t, "metadata.json", r.File[0].Name)
// check policy source code
assert.NotNil(t, r.File[1])
assert.Equal(t, "policy.rego", r.File[1].Name)
// check static data
assert.NotNil(t, r.File[2])
assert.Equal(t, "data.json", r.File[2].Name)
// check static data configuration
assert.NotNil(t, r.File[3])
assert.Equal(t, "data-config.json", r.File[3].Name)
})
}
File suppressed by a .gitattributes entry or the file's encoding is unsupported.
File suppressed by a .gitattributes entry or the file's encoding is unsupported.
File suppressed by a .gitattributes entry or the file's encoding is unsupported.
File suppressed by a .gitattributes entry or the file's encoding is unsupported.
File suppressed by a .gitattributes entry or the file's encoding is unsupported.
File suppressed by a .gitattributes entry or the file's encoding is unsupported.
File suppressed by a .gitattributes entry or the file's encoding is unsupported.
File suppressed by a .gitattributes entry or the file's encoding is unsupported.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment