1package lfs
 2
 3import (
 4	"errors"
 5	"path"
 6	"strconv"
 7	"testing"
 8)
 9
10func TestReadPointer(t *testing.T) {
11	cases := []struct {
12		name     string
13		content  string
14		want     Pointer
15		wantErr  error
16		wantErrp interface{}
17	}{
18		{
19			name: "valid pointer",
20			content: `version https://git-lfs.github.com/spec/v1
21oid sha256:1234567890123456789012345678901234567890123456789012345678901234
22size 1234
23`,
24			want: Pointer{
25				Oid:  "1234567890123456789012345678901234567890123456789012345678901234",
26				Size: 1234,
27			},
28		},
29		{
30			name: "invalid prefix",
31			content: `version https://foobar/spec/v2
32oid sha256:1234567890123456789012345678901234567890123456789012345678901234
33size 1234
34`,
35			wantErr: ErrMissingPrefix,
36		},
37		{
38			name: "invalid oid",
39			content: `version https://git-lfs.github.com/spec/v1
40oid sha256:&2345a78$012345678901234567890123456789012345678901234567890123
41size 1234
42`,
43			wantErr: ErrInvalidOIDFormat,
44		},
45		{
46			name: "invalid size",
47			content: `version https://git-lfs.github.com/spec/v1
48oid sha256:1234567890123456789012345678901234567890123456789012345678901234
49size abc
50`,
51			wantErrp: &strconv.NumError{},
52		},
53		{
54			name: "invalid structure",
55			content: `version https://git-lfs.github.com/spec/v1
56`,
57			wantErr: ErrInvalidStructure,
58		},
59		{
60			name:    "empty pointer",
61			wantErr: ErrMissingPrefix,
62		},
63	}
64
65	for _, tc := range cases {
66		t.Run(tc.name, func(t *testing.T) {
67			p, err := ReadPointerFromBuffer([]byte(tc.content))
68			if err != tc.wantErr && !errors.As(err, &tc.wantErrp) {
69				t.Errorf("ReadPointerFromBuffer() error = %v(%T), wantErr %v(%T)", err, err, tc.wantErr, tc.wantErr)
70				return
71			}
72			if err != nil {
73				return
74			}
75
76			if err == nil {
77				if !p.IsValid() {
78					t.Errorf("Expected a valid pointer")
79					return
80				}
81				if path.Join(p.Oid[:2], p.Oid[2:4], p.Oid) != p.RelativePath() {
82					t.Errorf("Expected a valid relative path")
83					return
84				}
85			}
86
87			if p.Oid != tc.want.Oid {
88				t.Errorf("ReadPointerFromBuffer() oid = %v, want %v", p.Oid, tc.want.Oid)
89			}
90			if p.Size != tc.want.Size {
91				t.Errorf("ReadPointerFromBuffer() size = %v, want %v", p.Size, tc.want.Size)
92			}
93		})
94	}
95}