mark/attachment/attachment_test.go
Manuel Rüger d6b37affd3 fix: use index-based loop in ResolveLocalAttachments to persist checksums
The range loop 'for _, attachment := range attachments' copied each
element by value. Assigning attachment.Checksum inside the loop only
modified the local copy; the original slice element was never updated.
All returned attachments had empty Checksum fields, causing every
attachment to be treated as changed on every run (the checksum
comparison would never match).

Switch to an index-based loop so the checksum is written directly to
the slice element.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-16 19:18:29 +01:00

91 lines
2.0 KiB
Go

package attachment
import (
"bytes"
"io"
"os"
"testing"
"github.com/stretchr/testify/assert"
)
var (
replacements = []string{
"image1.jpg",
"images/image2.jpg",
"../image3.jpg",
}
)
type bufferCloser struct {
*bytes.Buffer
}
func (bufferCloser) Close() error { return nil }
type virtualOpener struct {
PathToBuf map[string]*bufferCloser
}
func (o *virtualOpener) Open(name string) (io.ReadCloser, error) {
if buf, ok := o.PathToBuf[name]; ok {
return buf, nil
}
return nil, os.ErrNotExist
}
func TestPrepareAttachmentsWithWorkDirBase(t *testing.T) {
testingOpener := &virtualOpener{
PathToBuf: map[string]*bufferCloser{
"image1.jpg": {bytes.NewBuffer(nil)},
"images/image2.jpg": {bytes.NewBuffer(nil)},
"../image3.jpg": {bytes.NewBuffer(nil)},
},
}
attaches, err := prepareAttachments(testingOpener, ".", replacements)
t.Logf("attaches: %v", err)
if err != nil {
println(err.Error())
t.Fatal(err)
}
assert.Equal(t, "image1.jpg", attaches[0].Name)
assert.Equal(t, "image1.jpg", attaches[0].Replace)
assert.Equal(t, "images/image2.jpg", attaches[1].Name)
assert.Equal(t, "images/image2.jpg", attaches[1].Replace)
assert.Equal(t, "../image3.jpg", attaches[2].Name)
assert.Equal(t, "../image3.jpg", attaches[2].Replace)
assert.Equal(t, len(attaches), 3)
}
func TestPrepareAttachmentsWithSubDirBase(t *testing.T) {
testingOpener := &virtualOpener{
PathToBuf: map[string]*bufferCloser{
"a/b/image1.jpg": {bytes.NewBuffer(nil)},
"a/b/images/image2.jpg": {bytes.NewBuffer(nil)},
"a/image3.jpg": {bytes.NewBuffer(nil)},
},
}
attaches, err := prepareAttachments(testingOpener, "a/b", replacements)
if err != nil {
t.Fatal(err)
}
assert.Equal(t, "image1.jpg", attaches[0].Name)
assert.Equal(t, "image1.jpg", attaches[0].Replace)
assert.Equal(t, "images/image2.jpg", attaches[1].Name)
assert.Equal(t, "images/image2.jpg", attaches[1].Replace)
assert.Equal(t, "../image3.jpg", attaches[2].Name)
assert.Equal(t, "../image3.jpg", attaches[2].Replace)
assert.Equal(t, len(attaches), 3)
}