Skip to content

Commit

Permalink
Clarify difference between event and ticket
Browse files Browse the repository at this point in the history
  • Loading branch information
ahobsonsayers committed Sep 30, 2024
1 parent 74fea62 commit 33615e2
Show file tree
Hide file tree
Showing 7 changed files with 107 additions and 106 deletions.
42 changes: 21 additions & 21 deletions cmd/twitchets/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,13 +50,13 @@ func (c Config) Filters() []twickets.Filter {
for _, ticketConfig := range c.TicketsConfig {

var filter twickets.Filter
filter.Name = ticketConfig.Name
filter.Event = ticketConfig.Event

// Set name similarity
if ticketConfig.NameSimilarity == nil {
filter.NameSimilarity = c.GlobalConfig.NameSimilarity
} else if *ticketConfig.NameSimilarity > 0 {
filter.NameSimilarity = *ticketConfig.NameSimilarity
// Set event similarity
if ticketConfig.EventSimilarity == nil {
filter.EventSimilarity = c.GlobalConfig.EventSimilarity
} else if *ticketConfig.EventSimilarity > 0 {
filter.EventSimilarity = *ticketConfig.EventSimilarity
}

// Set regions
Expand Down Expand Up @@ -90,20 +90,20 @@ func (c Config) Filters() []twickets.Filter {
// unless an event explicitly overwrites its.
// Country is required.
type GlobalEventConfig struct {
NameSimilarity float64 `json:"nameSimilarity"`
Regions []twickets.Region `json:"regions"`
NumTickets int `json:"numTickets"`
Discount float64 `json:"discount"`
EventSimilarity float64 `json:"eventSimilarity"`
Regions []twickets.Region `json:"regions"`
NumTickets int `json:"numTickets"`
Discount float64 `json:"discount"`
}

func (c GlobalEventConfig) Validate() error {
// Reuse the filter validation logic
filter := twickets.Filter{
Name: "global", // Name must be be set - this is arbitrary
NameSimilarity: c.NameSimilarity,
Regions: c.Regions,
NumTickets: c.NumTickets,
Discount: c.Discount,
Event: "global", // Event must be be set - this is arbitrary
EventSimilarity: c.EventSimilarity,
Regions: c.Regions,
NumTickets: c.NumTickets,
Discount: c.Discount,
}
err := filter.Validate()
if err != nil {
Expand All @@ -114,15 +114,15 @@ func (c GlobalEventConfig) Validate() error {
}

type TicketConfig struct {
Name string `json:"name"`
NameSimilarity *float64 `json:"nameSimilarity"`
Regions []twickets.Region `json:"regions"`
NumTickets *int `json:"numTickets"`
Discount *float64 `json:"discount"`
Event string `json:"event"`
EventSimilarity *float64 `json:"eventSimilarity"`
Regions []twickets.Region `json:"regions"`
NumTickets *int `json:"numTickets"`
Discount *float64 `json:"discount"`
}

func (t TicketConfig) Validate() error {
if t.Name == "" {
if t.Event == "" {
return errors.New("event name must be set")
}

Expand Down
122 changes: 61 additions & 61 deletions cmd/twitchets/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ func TestLoadConfig(t *testing.T) {

country := twickets.CountryUnitedKingdom

globalNameSimilarity := 75.0
globalEventSimilarity := 75.0
globalRegions := []twickets.Region{twickets.RegionLondon, twickets.RegionNorthWest}
globalNumTickets := 2
globalDiscount := 25.0
Expand All @@ -25,43 +25,43 @@ func TestLoadConfig(t *testing.T) {
APIKey: "test",
Country: country,
GlobalConfig: GlobalEventConfig{
NameSimilarity: globalNameSimilarity,
Regions: globalRegions,
NumTickets: globalNumTickets,
Discount: globalDiscount,
EventSimilarity: globalEventSimilarity,
Regions: globalRegions,
NumTickets: globalNumTickets,
Discount: globalDiscount,
},
TicketsConfig: []TicketConfig{
{
// Event with only name set
Name: "Event 1",
// Ticket with only event set
Event: "Event 1",
},
{
// Event with regions set
Name: "Event 2",
// Ticket with name similarity set
Event: "Event 2",
EventSimilarity: lo.ToPtr(90.0),
},
{
// Ticket with regions set
Event: "Event 3",
Regions: []twickets.Region{twickets.RegionSouthWest},
},
{
// Event with num tickets set
Name: "Event 3",
// Ticket with num tickets set
Event: "Event 4",
NumTickets: lo.ToPtr(1),
},
{
// Event with discount set
Name: "Event 4",
// Ticket with discount set
Event: "Event 5",
Discount: lo.ToPtr(15.0),
},
{
// Event with name similarity set
Name: "Event 5",
NameSimilarity: lo.ToPtr(90.0),
},
{
// Event with globals unset
Name: "Event 6",
NameSimilarity: lo.ToPtr(-1.0),
Regions: []twickets.Region{},
NumTickets: lo.ToPtr(-1),
Discount: lo.ToPtr(-1.0),
// Ticket with globals unset
Event: "Event 6",
EventSimilarity: lo.ToPtr(-1.0),
Regions: []twickets.Region{},
NumTickets: lo.ToPtr(-1),
Discount: lo.ToPtr(-1.0),
},
},
}
Expand All @@ -76,59 +76,59 @@ func TestConfigFilters(t *testing.T) {

actualFilters := config.Filters()

globalNameSimilarity := 75.0
globalEventSimilarity := 75.0
globalRegions := []twickets.Region{twickets.RegionLondon, twickets.RegionNorthWest}
globalNumTickets := 2
globalDiscount := 25.0

expectedFilters := []twickets.Filter{
{
// Event with only name set
Name: "Event 1",
NameSimilarity: globalNameSimilarity,
Regions: globalRegions,
NumTickets: globalNumTickets,
Discount: globalDiscount,
// Ticket with only event name set
Event: "Event 1",
EventSimilarity: globalEventSimilarity,
Regions: globalRegions,
NumTickets: globalNumTickets,
Discount: globalDiscount,
},
{
// Event with regions set
Name: "Event 2",
NameSimilarity: globalNameSimilarity,
Regions: []twickets.Region{twickets.RegionSouthWest},
NumTickets: globalNumTickets,
Discount: globalDiscount,
// Ticket with event similarity set
Event: "Event 2",
EventSimilarity: 90.0,
Regions: globalRegions,
NumTickets: globalNumTickets,
Discount: globalDiscount,
},
{
// Event with num tickets set
Name: "Event 3",
NameSimilarity: globalNameSimilarity,
Regions: globalRegions,
NumTickets: 1,
Discount: globalDiscount,
// Ticket with regions set
Event: "Event 3",
EventSimilarity: globalEventSimilarity,
Regions: []twickets.Region{twickets.RegionSouthWest},
NumTickets: globalNumTickets,
Discount: globalDiscount,
},
{
// Event with discount set
Name: "Event 4",
NameSimilarity: globalNameSimilarity,
Regions: globalRegions,
NumTickets: globalNumTickets,
Discount: 15.0,
// Ticket with num tickets set
Event: "Event 4",
EventSimilarity: globalEventSimilarity,
Regions: globalRegions,
NumTickets: 1,
Discount: globalDiscount,
},
{
// Event with name similarity set
Name: "Event 5",
NameSimilarity: 90.0,
Regions: globalRegions,
NumTickets: globalNumTickets,
Discount: globalDiscount,
// Ticket with discount set
Event: "Event 5",
EventSimilarity: globalEventSimilarity,
Regions: globalRegions,
NumTickets: globalNumTickets,
Discount: 15.0,
},
{
// Event with globals unset
Name: "Event 6",
NameSimilarity: 0.0,
Regions: []twickets.Region{},
NumTickets: 0,
Discount: 0.0,
// Ticket with globals unset
Event: "Event 6",
EventSimilarity: 0.0,
Regions: []twickets.Region{},
NumTickets: 0,
Discount: 0.0,
},
}

Expand Down
4 changes: 2 additions & 2 deletions cmd/twitchets/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ func main() {
// Event names
eventNames := make([]string, 0, len(config.TicketsConfig))
for _, event := range config.TicketsConfig {
eventNames = append(eventNames, event.Name)
eventNames = append(eventNames, event.Event)
}
slog.Info(
fmt.Sprintf("Monitoring: %s", strings.Join(eventNames, ", ")),
Expand Down Expand Up @@ -109,7 +109,7 @@ func fetchAndProcessTickets(
for _, ticket := range filteredTickets {
slog.Info(
"Found tickets for monitored event",
"name", ticket.Event.Name,
"eventName", ticket.Event.Name,
"numTickets", ticket.TicketQuantity,
"ticketPrice", ticket.TotalTicketPrice().String(),
"originalTicketPrice", ticket.OriginalTicketPrice().String(),
Expand Down
1 change: 1 addition & 0 deletions cmd/twitchets/notification/gotify_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
)

func TestGotifySendTicketMessage(t *testing.T) {
t.Skip("Currently don't have a gotify server. Figure out how to test")
testutils.SkipIfCI(t, "No env set in CI. Fix")

_ = godotenv.Load(testutils.ProjectDirectoryJoin(t, ".env"))
Expand Down
18 changes: 9 additions & 9 deletions test/assets/config/config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,25 @@ apiKey: test
country: GB

global:
eventSimilarity: 75
regions:
- GBLO
- GBNW
numTickets: 2
discount: 25
nameSimilarity: 75

tickets:
- name: Event 1
- name: Event 2
- event: Event 1
- event: Event 2
eventSimilarity: 90
- event: Event 3
regions: [GBSW]
- name: Event 3
- event: Event 4
numTickets: 1
- name: Event 4
- event: Event 5
discount: 15
- name: Event 5
nameSimilarity: 90
- name: Event 6
nameSimilarity: -1
- event: Event 6
eventSimilarity: -1
regions: []
numTickets: -1
discount: -1
18 changes: 9 additions & 9 deletions twickets/filter.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,21 +11,21 @@ import (
)

type Filter struct {
Name string
NameSimilarity float64
Regions []Region
NumTickets int
Discount float64
Event string
EventSimilarity float64
Regions []Region
NumTickets int
Discount float64
}

func (f Filter) Validate() error {
if f.Name == "" {
if f.Event == "" {
return errors.New("event name must be set")
}

if f.NameSimilarity < 0 {
if f.EventSimilarity < 0 {
return errors.New("similarity cannot be negative")
} else if f.NameSimilarity > 100 {
} else if f.EventSimilarity > 100 {
return errors.New("similarity cannot above 100%")
}

Expand All @@ -48,7 +48,7 @@ func (f Filter) Validate() error {

// TicketMatches check is a ticket matches the filter
func (f Filter) TicketMatches(ticket Ticket) bool {
return matchesEventName(ticket, f.Name, f.NameSimilarity) &&
return matchesEventName(ticket, f.Event, f.EventSimilarity) &&
matchesRegions(ticket, f.Regions) &&
matchesNumTickets(ticket, f.NumTickets) &&
matchesDiscount(ticket, f.Discount)
Expand Down
8 changes: 4 additions & 4 deletions twickets/filter_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,28 +32,28 @@ func TestFilterName(t *testing.T) {

// Stranger Things
filteredTickets := gotTickets.Filter([]twickets.Filter{{
Name: strangerThingsAsked,
Event: strangerThingsAsked,
}})
require.Len(t, filteredTickets, 1)
require.Equal(t, strangerThingsGot, filteredTickets[0].Event.Name)

// Back to the Future
filteredTickets = gotTickets.Filter([]twickets.Filter{{
Name: backToTheFutureAsked,
Event: backToTheFutureAsked,
}})
require.Len(t, filteredTickets, 1)
require.Equal(t, backToTheFutureGot, filteredTickets[0].Event.Name)

// Harry Potter
filteredTickets = gotTickets.Filter([]twickets.Filter{{
Name: harryPotterAsked,
Event: harryPotterAsked,
}})
require.Len(t, filteredTickets, 1)
require.Equal(t, harryPotterGot, filteredTickets[0].Event.Name)

// Wizard of Oz
filteredTickets = gotTickets.Filter([]twickets.Filter{{
Name: wizardOfOzAsked,
Event: wizardOfOzAsked,
}})
require.Empty(t, filteredTickets)
}
Expand Down

0 comments on commit 33615e2

Please sign in to comment.