Exchange event info (#569)
Exchange Info feature added and verified with `mockdata` to ensure correctness
This commit is contained in:
parent
daa939f5f8
commit
4f5bb2b995
43
src/internal/connector/exchange/event.go
Normal file
43
src/internal/connector/exchange/event.go
Normal file
@ -0,0 +1,43 @@
|
||||
package exchange
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/microsoftgraph/msgraph-sdk-go/models"
|
||||
|
||||
"github.com/alcionai/corso/internal/common"
|
||||
"github.com/alcionai/corso/pkg/backup/details"
|
||||
)
|
||||
|
||||
// EventInfo searchable metadata for stored event objects.
|
||||
func EventInfo(evt models.Eventable) *details.ExchangeInfo {
|
||||
organizer := ""
|
||||
subject := ""
|
||||
start := time.Time{}
|
||||
|
||||
if evt.GetOrganizer() != nil &&
|
||||
evt.GetOrganizer().GetEmailAddress() != nil &&
|
||||
evt.GetOrganizer().GetEmailAddress().GetAddress() != nil {
|
||||
organizer = *evt.GetOrganizer().
|
||||
GetEmailAddress().
|
||||
GetAddress()
|
||||
}
|
||||
if evt.GetSubject() != nil {
|
||||
subject = *evt.GetSubject()
|
||||
}
|
||||
if evt.GetStart() != nil &&
|
||||
evt.GetStart().GetDateTime() != nil {
|
||||
// timeString has 'Z' literal added to ensure the stored
|
||||
// DateTime is not: time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC)
|
||||
timeString := *evt.GetStart().GetDateTime() + "Z"
|
||||
output, err := common.ParseTime(timeString)
|
||||
if err == nil {
|
||||
start = output
|
||||
}
|
||||
}
|
||||
return &details.ExchangeInfo{
|
||||
Organizer: organizer,
|
||||
Subject: subject,
|
||||
EventStart: start,
|
||||
}
|
||||
}
|
||||
98
src/internal/connector/exchange/event_test.go
Normal file
98
src/internal/connector/exchange/event_test.go
Normal file
@ -0,0 +1,98 @@
|
||||
package exchange
|
||||
|
||||
import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/microsoftgraph/msgraph-sdk-go/models"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/stretchr/testify/suite"
|
||||
|
||||
"github.com/alcionai/corso/internal/common"
|
||||
"github.com/alcionai/corso/internal/connector/mockconnector"
|
||||
"github.com/alcionai/corso/internal/connector/support"
|
||||
"github.com/alcionai/corso/pkg/backup/details"
|
||||
)
|
||||
|
||||
type EventSuite struct {
|
||||
suite.Suite
|
||||
}
|
||||
|
||||
func TestEventSuite(t *testing.T) {
|
||||
suite.Run(t, &EventSuite{})
|
||||
}
|
||||
|
||||
// TestEventInfo verifies that searchable event metadata
|
||||
// can be properly retrieved from a models.Eventable object
|
||||
func (suite *EventSuite) TestEventInfo() {
|
||||
initial := time.Now()
|
||||
|
||||
now := initial.Format(common.StandardTimeFormat)
|
||||
suite.T().Logf("Initial: %v\nFormatted: %v\n", initial, now)
|
||||
tests := []struct {
|
||||
name string
|
||||
evtAndRP func() (models.Eventable, *details.ExchangeInfo)
|
||||
}{
|
||||
{
|
||||
name: "Empty event",
|
||||
evtAndRP: func() (models.Eventable, *details.ExchangeInfo) {
|
||||
return models.NewEvent(), &details.ExchangeInfo{}
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "Start time only",
|
||||
evtAndRP: func() (models.Eventable, *details.ExchangeInfo) {
|
||||
event := models.NewEvent()
|
||||
dateTime := models.NewDateTimeTimeZone()
|
||||
dateTime.SetDateTime(&now)
|
||||
event.SetStart(dateTime)
|
||||
full, err := time.Parse(common.StandardTimeFormat, now)
|
||||
require.NoError(suite.T(), err)
|
||||
return event, &details.ExchangeInfo{Received: full}
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "Subject Only",
|
||||
evtAndRP: func() (models.Eventable, *details.ExchangeInfo) {
|
||||
subject := "Hello Corso"
|
||||
event := models.NewEvent()
|
||||
event.SetSubject(&subject)
|
||||
return event, &details.ExchangeInfo{Subject: subject}
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "Using mockable",
|
||||
evtAndRP: func() (models.Eventable, *details.ExchangeInfo) {
|
||||
bytes := mockconnector.GetMockEventBytes("Test Mock")
|
||||
event, err := support.CreateEventFromBytes(bytes)
|
||||
require.NoError(suite.T(), err)
|
||||
subject := " Test MockReview + Lunch"
|
||||
organizer := "foobar3@8qzvrj.onmicrosoft.com"
|
||||
eventTime := time.Date(2022, time.April, 28, 3, 41, 58, 0, time.UTC)
|
||||
return event, &details.ExchangeInfo{
|
||||
Subject: subject,
|
||||
Organizer: organizer,
|
||||
EventStart: eventTime,
|
||||
}
|
||||
},
|
||||
},
|
||||
}
|
||||
for _, test := range tests {
|
||||
suite.T().Run(test.name, func(t *testing.T) {
|
||||
event, expected := test.evtAndRP()
|
||||
result := EventInfo(event)
|
||||
suite.Equal(expected.Subject, result.Subject)
|
||||
suite.Equal(expected.Sender, result.Sender)
|
||||
expYear, expMonth, expDay := expected.EventStart.Date()
|
||||
expHr, expMin, expSec := expected.EventStart.Clock()
|
||||
recvYear, recvMonth, recvDay := result.EventStart.Date()
|
||||
recvHr, recvMin, recvSec := result.EventStart.Clock()
|
||||
suite.Equal(expYear, recvYear)
|
||||
suite.Equal(expMonth, recvMonth)
|
||||
suite.Equal(expDay, recvDay)
|
||||
suite.Equal(expHr, recvHr)
|
||||
suite.Equal(expMin, recvMin)
|
||||
suite.Equal(expSec, recvSec)
|
||||
})
|
||||
}
|
||||
}
|
||||
@ -225,7 +225,7 @@ func eventToDataCollection(
|
||||
return support.WrapAndAppend(*event.GetId(), errors.Wrap(err, "serializing content"), nil)
|
||||
}
|
||||
if byteArray != nil {
|
||||
dataChannel <- &Stream{id: *event.GetId(), message: byteArray, info: nil}
|
||||
dataChannel <- &Stream{id: *event.GetId(), message: byteArray, info: EventInfo(event)}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@ -128,6 +128,8 @@ type ExchangeInfo struct {
|
||||
Sender string `json:"sender,omitempty"`
|
||||
Subject string `json:"subject,omitempty"`
|
||||
Received time.Time `json:"received,omitempty"`
|
||||
EventStart time.Time `json:"eventStart,omitempty"`
|
||||
Organizer string `json:"organizer,omitempty"`
|
||||
ContactName string `json:"contactName,omitempty"`
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user