diff --git a/internal/store/.gitignore b/internal/store/.gitignore deleted file mode 100644 index 32bcdf1ac..000000000 --- a/internal/store/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/test \ No newline at end of file diff --git a/internal/store/store.go b/internal/store/store.go index 2e04b884a..4f0f08e9e 100644 --- a/internal/store/store.go +++ b/internal/store/store.go @@ -11,6 +11,8 @@ import ( type ( store struct { + fs afero.Fs + namespace string originalFn func(id uint64, ext string) string @@ -29,15 +31,27 @@ type ( } ) -func New(namespace string) (Store, error) { +var ( + defPreviewFn = func(id uint64, ext string) string { + return fmt.Sprintf("%d_preview.%s", id, ext) + } + + defOriginalFn = func(id uint64, ext string) string { + return fmt.Sprintf("%d.%s", id, ext) + } +) + +func New(namespace string) (*store, error) { + return NewWithAfero(afero.NewOsFs(), namespace) +} + +func NewWithAfero(fs afero.Fs, namespace string) (*store, error) { return &store{ + fs: fs, namespace: namespace, - originalFn: func(id uint64, ext string) string { - return fmt.Sprintf("%d.%s", id, ext) - }, - previewFn: func(id uint64, ext string) string { - return fmt.Sprintf("%d_preview.%s", id, ext) - }, + + originalFn: defOriginalFn, + previewFn: defPreviewFn, }, nil } @@ -65,18 +79,19 @@ func (s *store) Preview(id uint64, ext string) string { return path.Join(s.namespace, s.previewFn(id, ext)) } -func (s *store) Save(filename string, contents io.Reader) error { +func (s *store) Save(filename string, contents io.Reader) (err error) { // check filename for validity - if err := s.check(filename); err != nil { - return err + if err = s.check(filename); err != nil { + return } folder := path.Dir(filename) - fs := afero.NewOsFs() - fs.MkdirAll(folder, 0755) + if err = s.fs.MkdirAll(folder, 0755); err != nil { + return + } - return afero.WriteReader(fs, filename, contents) + return afero.WriteReader(s.fs, filename, contents) } func (s *store) Remove(filename string) error { @@ -85,8 +100,7 @@ func (s *store) Remove(filename string) error { return err } - fs := afero.NewOsFs() - return fs.Remove(filename) + return s.fs.Remove(filename) } func (s *store) Open(filename string) (afero.File, error) { @@ -95,6 +109,5 @@ func (s *store) Open(filename string) (afero.File, error) { return nil, err } - fs := afero.NewOsFs() - return fs.Open(filename) + return s.fs.Open(filename) } diff --git a/internal/store/store_test.go b/internal/store/store_test.go index 9732bb532..8e4799a9c 100644 --- a/internal/store/store_test.go +++ b/internal/store/store_test.go @@ -5,6 +5,8 @@ import ( "io" "testing" + "github.com/spf13/afero" + "github.com/cortezaproject/corteza-server/internal/test" ) @@ -15,7 +17,8 @@ func TestStore(t *testing.T) { return b.String() } - store, err := New("test") + store, err := NewWithAfero(afero.NewMemMapFs(), "test") + test.Assert(t, err == nil, "Unexpected error when creating store: %+v", err) test.Assert(t, store != nil, "Expected non-nil return for new store") test.Assert(t, store.Namespace() == "test", "Unexpected store namespace: test != %s", store.Namespace()) diff --git a/messaging/service/service.go b/messaging/service/service.go index a8793b1ac..0d3d5a235 100644 --- a/messaging/service/service.go +++ b/messaging/service/service.go @@ -29,6 +29,7 @@ type ( ) var ( + DefaultStore store.Store DefaultPermissions permissionServicer DefaultLogger *zap.Logger @@ -46,10 +47,12 @@ var ( func Init(ctx context.Context, log *zap.Logger, c Config) (err error) { DefaultLogger = log.Named("service") - fs, err := store.New(c.Storage.Path) - log.Info("initializing store", zap.String("path", c.Storage.Path), zap.Error(err)) - if err != nil { - return err + if DefaultStore == nil { + DefaultStore, err = store.New(c.Storage.Path) + log.Info("initializing store", zap.String("path", c.Storage.Path), zap.Error(err)) + if err != nil { + return err + } } client, err := http.New(&http.Config{ @@ -59,15 +62,17 @@ func Init(ctx context.Context, log *zap.Logger, c Config) (err error) { return err } - DefaultPermissions = permissions.Service( - ctx, - DefaultLogger, - permissions.Repository(repository.DB(ctx), "messaging_permission_rules")) + if DefaultPermissions == nil { + // Do not override permissions service stored under DefaultPermissions + // to allow integration tests to inject own permission service + pRepo := permissions.Repository(repository.DB(ctx), "messaging_permission_rules") + DefaultPermissions = permissions.Service(ctx, DefaultLogger, pRepo) + } DefaultAccessControl = AccessControl(DefaultPermissions) DefaultEvent = Event(ctx) DefaultChannel = Channel(ctx) - DefaultAttachment = Attachment(ctx, fs) + DefaultAttachment = Attachment(ctx, DefaultStore) DefaultMessage = Message(ctx) DefaultCommand = Command(ctx) DefaultWebhook = Webhook(ctx, client)