14 77918b00 2024-03-07 o func TestMailAddress(t *testing.T) {
15 77918b00 2024-03-07 o tests := []struct {
18 77918b00 2024-03-07 o followers string
21 77918b00 2024-03-07 o "testdata/actor/mastodon.json",
22 77918b00 2024-03-07 o `"Oliver Lowe" <otl@hachyderm.io>`,
23 77918b00 2024-03-07 o `"Oliver Lowe (followers)" <otl+followers@hachyderm.io>`,
26 77918b00 2024-03-07 o "testdata/actor/akkoma.json",
27 77918b00 2024-03-07 o `"Kari'boka" <kariboka@social.harpia.red>`,
28 77918b00 2024-03-07 o `"Kari'boka (followers)" <kariboka+followers@social.harpia.red>`,
31 77918b00 2024-03-07 o "testdata/actor/lemmy.json",
32 77918b00 2024-03-07 o "<Spotlight7573@lemmy.world>",
33 d802abd8 2024-03-12 o "<@>", // zero mail.Address
36 77918b00 2024-03-07 o for _, tt := range tests {
37 77918b00 2024-03-07 o f, err := os.Open(tt.name)
38 77918b00 2024-03-07 o if err != nil {
42 77918b00 2024-03-07 o defer f.Close()
43 77918b00 2024-03-07 o actor, err := DecodeActor(f)
44 77918b00 2024-03-07 o if err != nil {
45 77918b00 2024-03-07 o t.Errorf("%s: decode actor: %v", tt.name, err)
48 77918b00 2024-03-07 o if actor.Address().String() != tt.from {
49 77918b00 2024-03-07 o t.Errorf("%s: from address: want %s, got %s", tt.name, tt.from, actor.Address().String())
51 77918b00 2024-03-07 o got := actor.FollowersAddress().String()
52 77918b00 2024-03-07 o if got != tt.followers {
53 77918b00 2024-03-07 o t.Errorf("%s: followers address: want %s, got %s", tt.name, tt.followers, got)
58 77918b00 2024-03-07 o func TestMarshalMail(t *testing.T) {
59 d3dfb672 2024-03-18 o tests := []struct {
61 d3dfb672 2024-03-18 o recipients []string
64 d3dfb672 2024-03-18 o "testdata/note/akkoma.json",
66 d3dfb672 2024-03-18 o "kariboka+followers@social.harpia.red",
67 d3dfb672 2024-03-18 o "otl@apubtest2.srcbeat.com",
71 d3dfb672 2024-03-18 o "testdata/note/lemmy.json",
73 d3dfb672 2024-03-18 o "Feathercrown@lemmy.world",
74 d3dfb672 2024-03-18 o "technology@lemmy.world",
78 d3dfb672 2024-03-18 o "testdata/note/mastodon.json",
80 d3dfb672 2024-03-18 o "otl+followers@hachyderm.io",
81 d3dfb672 2024-03-18 o "selfhosted+followers@lemmy.world",
82 d3dfb672 2024-03-18 o "selfhosted@lemmy.world",
86 d3dfb672 2024-03-18 o "testdata/page.json",
88 d3dfb672 2024-03-18 o "technology@lemmy.world",
92 d3dfb672 2024-03-18 o for _, tt := range tests {
93 d3dfb672 2024-03-18 o f, err := os.Open(tt.name)
94 77918b00 2024-03-07 o if err != nil {
98 77918b00 2024-03-07 o defer f.Close()
99 77918b00 2024-03-07 o a, err := Decode(f)
100 77918b00 2024-03-07 o if err != nil {
101 d3dfb672 2024-03-18 o t.Errorf("%s: decode activity: %v", tt.name, err)
104 d3dfb672 2024-03-18 o b, err := MarshalMail(a, nil)
105 77918b00 2024-03-07 o if err != nil {
106 d3dfb672 2024-03-18 o t.Errorf("%s: marshal to mail message: %v", tt.name, err)
109 184e4de6 2024-03-13 o msg, err := mail.ReadMessage(bytes.NewReader(b))
110 184e4de6 2024-03-13 o if err != nil {
111 d3dfb672 2024-03-18 o t.Errorf("%s: read back message from marshalled activity: %v", tt.name, err)
114 d3dfb672 2024-03-18 o rcptto, err := msg.Header.AddressList("To")
115 d3dfb672 2024-03-18 o if errors.Is(err, mail.ErrHeaderNotPresent) {
116 d3dfb672 2024-03-18 o // whatever; sometimes the Activity has an empty slice.
117 d3dfb672 2024-03-18 o } else if err != nil {
118 d3dfb672 2024-03-18 o t.Errorf("%s: parse To addresses: %v", tt.name, err)
119 d3dfb672 2024-03-18 o t.Log("raw value:", msg.Header.Get("To"))
122 d3dfb672 2024-03-18 o rcptcc, err := msg.Header.AddressList("CC")
123 d3dfb672 2024-03-18 o if errors.Is(err, mail.ErrHeaderNotPresent) {
124 d3dfb672 2024-03-18 o // whatever; sometimes the Activity has an empty slice.
125 d3dfb672 2024-03-18 o } else if err != nil {
126 d3dfb672 2024-03-18 o t.Errorf("%s: parse CC addresses: %v", tt.name, err)
127 d3dfb672 2024-03-18 o t.Log("raw value:", msg.Header.Get("CC"))
132 d3dfb672 2024-03-18 o rcpts := make([]string, len(rcptto)+len(rcptcc))
133 d3dfb672 2024-03-18 o for i, rcpt := range append(rcptto, rcptcc...) {
134 d3dfb672 2024-03-18 o rcpts[i] = rcpt.Address
136 d3dfb672 2024-03-18 o sort.Strings(rcpts)
137 d3dfb672 2024-03-18 o if !reflect.DeepEqual(rcpts, tt.recipients) {
138 d3dfb672 2024-03-18 o t.Errorf("%s: unexpected recipients, want %s got %s", tt.name, tt.recipients, rcpts)
141 184e4de6 2024-03-13 o p := make([]byte, 8)
142 d3dfb672 2024-03-18 o if _, err := msg.Body.Read(p); err != nil {
143 d3dfb672 2024-03-18 o // Pages have no content, so skip this case
144 184e4de6 2024-03-13 o if a.Type == "Page" {
147 d3dfb672 2024-03-18 o t.Errorf("%s: read message body: %v", tt.name, err)
152 77918b00 2024-03-07 o func TestUnmarshalMail(t *testing.T) {
153 77918b00 2024-03-07 o f, err := os.Open("testdata/outbound.eml")
154 1d5ddf5d 2024-02-20 o if err != nil {
157 1d5ddf5d 2024-02-20 o defer f.Close()
158 77918b00 2024-03-07 o msg, err := mail.ReadMessage(f)
159 1d5ddf5d 2024-02-20 o if err != nil {
162 77918b00 2024-03-07 o if testing.Short() {
163 77918b00 2024-03-07 o t.Skip("skipping network calls to unmarshal mail message to Activity")
165 d3dfb672 2024-03-18 o a, err := UnmarshalMail(msg, nil)
166 d802abd8 2024-03-12 o if err != nil {
169 d802abd8 2024-03-12 o if len(a.Tag) != 1 {
170 d802abd8 2024-03-12 o t.Fatalf("wanted 1 tag in unmarshalled activity, got %d", len(a.Tag))
172 d802abd8 2024-03-12 o want := "@henfredemars@infosec.pub"
173 d802abd8 2024-03-12 o if a.Tag[0].Name != want {
174 d802abd8 2024-03-12 o t.Errorf("wanted tag name %s, got %s", want, a.Tag[0].Name)
176 d3dfb672 2024-03-18 o if a.MediaType != "text/markdown" {
177 d3dfb672 2024-03-18 o t.Errorf("wrong media type: wanted %s, got %s", "text/markdown", a.MediaType)
179 d3dfb672 2024-03-18 o wantCC := []string{
180 d3dfb672 2024-03-18 o "https://programming.dev/c/programming",
181 d3dfb672 2024-03-18 o "https://programming.dev/u/starman",
182 d3dfb672 2024-03-18 o "https://hachyderm.io/users/otl/followers",
184 d3dfb672 2024-03-18 o if !reflect.DeepEqual(wantCC, a.CC) {
185 d3dfb672 2024-03-18 o t.Errorf("wanted recipients %s, got %s", wantCC, a.CC)
187 d3dfb672 2024-03-18 o if strings.Contains(a.Content, "\r") {
188 d3dfb672 2024-03-18 o t.Errorf("activity content contains carriage returns")