master
  1package gitdiff
  2
  3import (
  4	"testing"
  5)
  6
  7func TestParsePatchIdentity(t *testing.T) {
  8	tests := map[string]struct {
  9		Input  string
 10		Output PatchIdentity
 11		Err    interface{}
 12	}{
 13		"simple": {
 14			Input: "Morton Haypenny <mhaypenny@example.com>",
 15			Output: PatchIdentity{
 16				Name:  "Morton Haypenny",
 17				Email: "mhaypenny@example.com",
 18			},
 19		},
 20		"extraWhitespace": {
 21			Input: "\t  Morton Haypenny  \r\n<mhaypenny@example.com>  ",
 22			Output: PatchIdentity{
 23				Name:  "Morton Haypenny",
 24				Email: "mhaypenny@example.com",
 25			},
 26		},
 27		"trailingCharacters": {
 28			Input: "Morton Haypenny <mhaypenny@example.com> II",
 29			Output: PatchIdentity{
 30				Name:  "Morton Haypenny II",
 31				Email: "mhaypenny@example.com",
 32			},
 33		},
 34		"onlyEmail": {
 35			Input: "mhaypenny@example.com",
 36			Output: PatchIdentity{
 37				Name:  "mhaypenny@example.com",
 38				Email: "mhaypenny@example.com",
 39			},
 40		},
 41		"onlyEmailInBrackets": {
 42			Input: "<mhaypenny@example.com>",
 43			Output: PatchIdentity{
 44				Name:  "mhaypenny@example.com",
 45				Email: "mhaypenny@example.com",
 46			},
 47		},
 48		"rfc5322SpecialCharacters": {
 49			Input: `"dependabot[bot]" <12345+dependabot[bot]@users.noreply.github.com>`,
 50			Output: PatchIdentity{
 51				Name:  "dependabot[bot]",
 52				Email: "12345+dependabot[bot]@users.noreply.github.com",
 53			},
 54		},
 55		"rfc5322QuotedPairs": {
 56			Input: `"Morton \"Old-Timer\" Haypenny" <"mhaypenny\+[1900]"@example.com> (III \(PhD\))`,
 57			Output: PatchIdentity{
 58				Name:  `Morton "Old-Timer" Haypenny (III (PhD))`,
 59				Email: "mhaypenny+[1900]@example.com",
 60			},
 61		},
 62		"rfc5322QuotedPairsOutOfContext": {
 63			Input: `Morton \\Backslash Haypenny <mhaypenny@example.com>`,
 64			Output: PatchIdentity{
 65				Name:  `Morton \\Backslash Haypenny`,
 66				Email: "mhaypenny@example.com",
 67			},
 68		},
 69		"emptyEmail": {
 70			Input: "Morton Haypenny <>",
 71			Output: PatchIdentity{
 72				Name:  "Morton Haypenny",
 73				Email: "",
 74			},
 75		},
 76		"unclosedEmail": {
 77			Input: "Morton Haypenny <mhaypenny@example.com",
 78			Output: PatchIdentity{
 79				Name:  "Morton Haypenny",
 80				Email: "mhaypenny@example.com",
 81			},
 82		},
 83		"bogusEmail": {
 84			Input: "Morton Haypenny <mhaypenny>",
 85			Output: PatchIdentity{
 86				Name:  "Morton Haypenny",
 87				Email: "mhaypenny",
 88			},
 89		},
 90		"bogusEmailWithWhitespace": {
 91			Input: "Morton Haypenny <  mhaypenny  >",
 92			Output: PatchIdentity{
 93				Name:  "Morton Haypenny",
 94				Email: "mhaypenny",
 95			},
 96		},
 97		"missingEmail": {
 98			Input: "Morton Haypenny",
 99			Err:   "invalid identity",
100		},
101		"missingNameAndEmptyEmail": {
102			Input: "<>",
103			Err:   "invalid identity",
104		},
105		"empty": {
106			Input: "",
107			Err:   "invalid identity",
108		},
109	}
110
111	for name, test := range tests {
112		t.Run(name, func(t *testing.T) {
113			id, err := ParsePatchIdentity(test.Input)
114			if test.Err != nil {
115				assertError(t, test.Err, err, "parsing identity")
116				return
117			}
118			if err != nil {
119				t.Fatalf("unexpected error parsing identity: %v", err)
120			}
121
122			if test.Output != id {
123				t.Errorf("incorrect identity: expected %#v, actual %#v", test.Output, id)
124			}
125		})
126	}
127}