diff --git a/pkg/files/file.go b/pkg/files/file.go index 8f9f3bfe70a173318196dd630e4093bdf16028d5..0e4d89f7004413b2c2a0ae9eff663cdcfc0ef3a1 100644 --- a/pkg/files/file.go +++ b/pkg/files/file.go @@ -1,9 +1,11 @@ package files import ( + "bytes" "fmt" "io/fs" "strings" + "text/template" "git.perx.ru/perxis/perxis-go/pkg/id" ) @@ -31,6 +33,20 @@ func (f File) Temporary() bool { return strings.HasPrefix(f.ID, TemporaryPrefix) } +func (f *File) SetURLWithTemplate(t *template.Template) error { + if t == nil { + return nil + } + + res := new(bytes.Buffer) + if err := t.Execute(res, f); err != nil { + return err + } + + f.URL = res.String() + return nil +} + func (f File) Fetch(i interface{}) interface{} { p, _ := i.(string) switch p { diff --git a/pkg/files/file_test.go b/pkg/files/file_test.go new file mode 100644 index 0000000000000000000000000000000000000000..14fb89ce8c054d57ea708a10eb27318b474ff99c --- /dev/null +++ b/pkg/files/file_test.go @@ -0,0 +1,57 @@ +package files + +import ( + "testing" + "text/template" + + "github.com/stretchr/testify/require" +) + +func TestFile_SetURLWithTemplate(t *testing.T) { + tests := []struct { + name string + file *File + template *template.Template + wantErr bool + wantURL string + }{ + { + name: "template is nil", + file: &File{ + URL: "https://cloud.com/", + }, + template: nil, + wantErr: false, + wantURL: "https://cloud.com/", + }, + { + name: "template with non-existent field", + file: &File{}, + template: template.Must(template.New("url").Parse("{{.NonExistentField}}")), + wantErr: true, + }, + { + name: "success", + file: &File{ + Size: 1024, + MimeType: "image/png", + Key: "file-key", + }, + template: template.Must(template.New("url").Parse("https://cloud-proxy.com/{{.Key}}?size={{.Size}}#{{.MimeType}}")), + wantErr: false, + wantURL: "https://cloud-proxy.com/file-key?size=1024#image/png", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.file.SetURLWithTemplate(tt.template) + if tt.wantErr { + require.Error(t, err) + } else { + require.NoError(t, err) + require.Equal(t, tt.wantURL, tt.file.URL) + } + }) + } +}