Skip to content

Commit f8e2239

Browse files
author
Shubham Gupta
committed
Add api to create events with default values
1 parent 0910604 commit f8e2239

17 files changed

+316
-44
lines changed

Diff for: .formatter.exs

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
[
2+
inputs: [
3+
"mix.exs", "{config,lib,test}/**/*.{ex,exs}"
4+
],
5+
6+
locals_without_parens: [
7+
# Formatter tests
8+
assert_format: 2,
9+
assert_format: 3,
10+
assert_same: 1,
11+
assert_same: 2,
12+
13+
# Errors tests
14+
assert_eval_raise: 3
15+
]
16+
]

Diff for: lib/snowplow_tracker/events/behaviour.ex

+6
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,12 @@ defmodule SnowplowTracker.Events.Behaviour do
44
"""
55
alias SnowplowTracker.Payload
66

7+
@doc """
8+
This function accepts a map and returns a struct containing the event
9+
properties else it raises an appropriate error.
10+
"""
11+
@callback new(map() | any()) :: struct() | no_return()
12+
713
@doc """
814
This function accepts a struct() object and validates the it's fields. If it is valid,
915
it returns the object else it raises an appropriate error.

Diff for: lib/snowplow_tracker/events/ecommerce_transaction.ex

+29-5
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,15 @@ defmodule SnowplowTracker.Events.EcommerceTransaction do
3232
# Optional
3333
:currency,
3434
# Optional
35-
items: [],
35+
:items,
3636
# Optional
37-
timestamp: EventsHelper.generate_timestamp(),
37+
:timestamp,
3838
# Optional
39-
event_id: EventsHelper.generate_uuid(),
39+
:event_id,
4040
# Optional
41-
true_timestamp: EventsHelper.generate_timestamp(),
41+
:true_timestamp,
4242
# Optional
43-
contexts: []
43+
:contexts
4444
]
4545

4646
defstruct @keys
@@ -64,6 +64,30 @@ defmodule SnowplowTracker.Events.EcommerceTransaction do
6464

6565
# Public API
6666

67+
@spec new(map() | any()) :: t() | no_return()
68+
def new(data) when is_map(data) do
69+
%__MODULE__{
70+
order_id: Map.get(data, :order_id),
71+
total_value: Map.get(data, :total_value),
72+
affiliation: Map.get(data, :affiliation),
73+
tax_value: Map.get(data, :tax_value),
74+
shipping: Map.get(data, :shipping),
75+
city: Map.get(data, :city),
76+
state: Map.get(data, :state),
77+
country: Map.get(data, :country),
78+
currency: Map.get(data, :currency),
79+
items: Map.get(data, :items),
80+
timestamp: Map.get(data, :timestamp, EventsHelper.generate_timestamp()),
81+
event_id: Map.get(data, :event_id, EventsHelper.generate_uuid()),
82+
true_timestamp: Map.get(data, :true_timestamp, EventsHelper.generate_timestamp()),
83+
contexts: Map.get(data, :contexts, [])
84+
}
85+
end
86+
87+
def new(data) do
88+
raise Errors.InvalidParam, "expected map, received #{data}"
89+
end
90+
6791
@spec validate(t()) :: t() | no_return()
6892
def validate(%EcommerceTransaction{order_id: ""}) do
6993
raise Errors.InvalidParam, "order_id cannot be blank"

Diff for: lib/snowplow_tracker/events/ecommerce_transaction_item.ex

+19-2
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@ defmodule SnowplowTracker.Events.EcommerceTransactionItem do
2020
# Optional
2121
:category,
2222
# Optional
23-
event_id: EventsHelper.generate_uuid(),
23+
:event_id,
2424
# Optional
25-
contexts: []
25+
:contexts
2626
]
2727

2828
defstruct @keys
@@ -37,6 +37,23 @@ defmodule SnowplowTracker.Events.EcommerceTransactionItem do
3737
contexts: list(SelfDescribingJson.t())
3838
}
3939

40+
@spec new(map() | any()) :: t() | no_return()
41+
def new(data) when is_map(data) do
42+
%__MODULE__{
43+
sku: Map.get(data, :sku),
44+
price: Map.get(data, :price),
45+
quantity: Map.get(data, :quantity),
46+
name: Map.get(data, :name),
47+
category: Map.get(data, :category),
48+
event_id: Map.get(data, :event_id, EventsHelper.generate_uuid()),
49+
contexts: Map.get(data, :contexts, [])
50+
}
51+
end
52+
53+
def new(data) do
54+
raise Errors.InvalidParam, "expected map, received #{data}"
55+
end
56+
4057
@spec validate(t()) :: t() | no_return()
4158
def validate(%EcommerceTransactionItem{sku: ""}) do
4259
raise Errors.InvalidParam, "sku cannot be empty"

Diff for: lib/snowplow_tracker/events/page_view.ex

+23-7
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ defmodule SnowplowTracker.Events.PageView do
55
@behaviour SnowplowTracker.Events.Behaviour
66

77
alias SnowplowTracker.{Errors, Constants, Payload, SelfDescribingJson}
8-
alias SnowplowTracker.Events.Helper
8+
alias SnowplowTracker.Events.Helper, as: EventsHelper
99

1010
alias __MODULE__
1111

@@ -19,13 +19,13 @@ defmodule SnowplowTracker.Events.PageView do
1919
# Optional
2020
:referrer,
2121
# Optional
22-
timestamp: Helper.generate_timestamp(),
22+
:timestamp,
2323
# Optional
24-
event_id: Helper.generate_uuid(),
24+
:event_id,
2525
# Optional
26-
true_timestamp: Helper.generate_timestamp(),
26+
:true_timestamp,
2727
# Optional
28-
contexts: []
28+
:contexts
2929
]
3030

3131
@type t :: %__MODULE__{
@@ -40,6 +40,22 @@ defmodule SnowplowTracker.Events.PageView do
4040

4141
defstruct @keys
4242

43+
@spec new(map() | any()) :: t() | no_return()
44+
def new(data) when is_map(data) do
45+
%__MODULE__{
46+
page_url: Map.get(data, :page_url),
47+
page_title: Map.get(data, :page_title),
48+
timestamp: Map.get(data, :timestamp, EventsHelper.generate_timestamp()),
49+
event_id: Map.get(data, :event_id, EventsHelper.generate_uuid()),
50+
true_timestamp: Map.get(data, :true_timestamp, EventsHelper.generate_timestamp()),
51+
contexts: Map.get(data, :contexts, [])
52+
}
53+
end
54+
55+
def new(data) do
56+
raise Errors.InvalidParam, "expected map, received #{data}"
57+
end
58+
4359
@spec validate(t()) :: t() | no_return()
4460
def validate(%PageView{page_url: url}) when is_nil(url) or url == "" do
4561
raise Errors.InvalidParam, "page_url cannot be blank"
@@ -54,9 +70,9 @@ defmodule SnowplowTracker.Events.PageView do
5470
Constants.page_url() => event.page_url,
5571
Constants.page_title() => event.page_title,
5672
Constants.page_refr() => event.referrer,
57-
Constants.timestamp() => Helper.to_string(event.timestamp),
73+
Constants.timestamp() => EventsHelper.to_string(event.timestamp),
5874
Constants.eid() => event.event_id,
59-
Constants.true_timestamp() => Helper.to_string(event.true_timestamp)
75+
Constants.true_timestamp() => EventsHelper.to_string(event.true_timestamp)
6076
}
6177
|> (&Payload.add_map(%Payload{}, &1)).()
6278
end

Diff for: lib/snowplow_tracker/events/screen_view.ex

+20-4
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,13 @@ defmodule SnowplowTracker.Events.ScreenView do
1717
# Optional
1818
:id,
1919
# Optional
20-
timestamp: EventsHelper.generate_timestamp(),
20+
:timestamp,
2121
# Optional
22-
event_id: EventsHelper.generate_uuid(),
22+
:event_id,
2323
# Optional
24-
true_timestamp: EventsHelper.generate_timestamp(),
24+
:true_timestamp,
2525
# Optional
26-
contexts: []
26+
:contexts
2727
]
2828

2929
@type t :: %__MODULE__{
@@ -37,6 +37,22 @@ defmodule SnowplowTracker.Events.ScreenView do
3737

3838
defstruct @keys
3939

40+
@spec new(map() | any()) :: t() | no_return()
41+
def new(data) when is_map(data) do
42+
%__MODULE__{
43+
name: Map.get(data, :name),
44+
id: Map.get(data, :id),
45+
timestamp: Map.get(data, :timestamp, EventsHelper.generate_timestamp()),
46+
event_id: Map.get(data, :event_id, EventsHelper.generate_uuid()),
47+
true_timestamp: Map.get(data, :true_timestamp, EventsHelper.generate_timestamp()),
48+
contexts: Map.get(data, :contexts, [])
49+
}
50+
end
51+
52+
def new(data) do
53+
raise Errors.InvalidParam, "expected map, received #{data}"
54+
end
55+
4056
@spec validate(t()) :: t() | no_return()
4157
def validate(%ScreenView{name: nil, id: nil}) do
4258
raise Errors.InvalidParam, "name and id both cannot be blank"

Diff for: lib/snowplow_tracker/events/self_describing.ex

+21-6
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ defmodule SnowplowTracker.Events.SelfDescribing do
33
This module implements the Self Describing event.
44
"""
55

6-
alias SnowplowTracker.{Constants, Payload, SelfDescribingJson}
6+
alias SnowplowTracker.{Errors, Constants, Payload, SelfDescribingJson}
77
alias SnowplowTracker.Events.Helper, as: EventsHelper
88

99
alias __MODULE__
@@ -12,15 +12,15 @@ defmodule SnowplowTracker.Events.SelfDescribing do
1212

1313
@keys [
1414
# Required
15-
event: %SelfDescribingJson{},
15+
:event,
1616
# Optional
17-
timestamp: EventsHelper.generate_timestamp(),
17+
:timestamp,
1818
# Optional
19-
event_id: EventsHelper.generate_uuid(),
19+
:event_id,
2020
# Optional
21-
true_timestamp: EventsHelper.generate_timestamp(),
21+
:true_timestamp,
2222
# Optional
23-
contexts: []
23+
:contexts
2424
]
2525

2626
defstruct @keys
@@ -33,6 +33,21 @@ defmodule SnowplowTracker.Events.SelfDescribing do
3333
contexts: list(SelfDescribingJson.t())
3434
}
3535

36+
@spec new(map() | any()) :: t() | no_return()
37+
def new(data) when is_map(data) do
38+
%__MODULE__{
39+
event: Map.get(data, :event, %SelfDescribingJson{}),
40+
timestamp: Map.get(data, :timestamp, EventsHelper.generate_timestamp()),
41+
event_id: Map.get(data, :event_id, EventsHelper.generate_uuid()),
42+
true_timestamp: Map.get(data, :true_timestamp, EventsHelper.generate_timestamp()),
43+
contexts: Map.get(data, :contexts, [])
44+
}
45+
end
46+
47+
def new(data) do
48+
raise Errors.InvalidParam, "expected map, received #{data}"
49+
end
50+
3651
@spec validate(t()) :: t()
3752
def validate(%SelfDescribing{} = event), do: event
3853

Diff for: lib/snowplow_tracker/events/structured.ex

+24-7
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@ defmodule SnowplowTracker.Events.Structured do
1010

1111
alias __MODULE__
1212

13-
@enforce_keys [:category, :action]
14-
1513
@keys [
1614
# Required
1715
:category,
@@ -22,15 +20,15 @@ defmodule SnowplowTracker.Events.Structured do
2220
# Optional
2321
:property,
2422
# Optional
25-
value: 0.0,
23+
:value,
2624
# Optional
27-
timestamp: EventsHelper.generate_timestamp(),
25+
:timestamp,
2826
# Optional
29-
event_id: EventsHelper.generate_uuid(),
27+
:event_id,
3028
# Optional
31-
true_timestamp: EventsHelper.generate_timestamp(),
29+
:true_timestamp,
3230
# Optional
33-
contexts: []
31+
:contexts
3432
]
3533

3634
defstruct @keys
@@ -47,6 +45,25 @@ defmodule SnowplowTracker.Events.Structured do
4745
contexts: list(SelfDescribingJson.t())
4846
}
4947

48+
@spec new(map() | any()) :: t() | no_return()
49+
def new(data) when is_map(data) do
50+
%__MODULE__{
51+
category: Map.get(data, :category),
52+
action: Map.get(data, :action),
53+
label: Map.get(data, :label),
54+
property: Map.get(data, :property),
55+
value: Map.get(data, :value, 0.0),
56+
timestamp: Map.get(data, :timestamp, EventsHelper.generate_timestamp()),
57+
event_id: Map.get(data, :event_id, EventsHelper.generate_uuid()),
58+
true_timestamp: Map.get(data, :true_timestamp, EventsHelper.generate_timestamp()),
59+
contexts: Map.get(data, :contexts, [])
60+
}
61+
end
62+
63+
def new(data) do
64+
raise Errors.InvalidParam, "expected map, received #{data}"
65+
end
66+
5067
@spec validate(t()) :: t() | no_return()
5168
def validate(%Structured{category: ""}) do
5269
raise Errors.InvalidParam, "category cannot be blank"

Diff for: lib/snowplow_tracker/events/timing.ex

+22-4
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,13 @@ defmodule SnowplowTracker.Events.Timing do
2323
# Optional
2424
:label,
2525
# Optional
26-
timestamp: EventsHelper.generate_timestamp(),
26+
:timestamp,
2727
# Optional
28-
event_id: EventsHelper.generate_uuid(),
28+
:event_id,
2929
# Optional
30-
true_timestamp: EventsHelper.generate_timestamp(),
30+
:true_timestamp,
3131
# Optional
32-
contexts: []
32+
:contexts
3333
]
3434

3535
defstruct @keys
@@ -45,6 +45,24 @@ defmodule SnowplowTracker.Events.Timing do
4545
contexts: list(%SelfDescribingJson{})
4646
}
4747

48+
@spec new(map()) :: t() | no_return()
49+
def new(data) when is_map(data) do
50+
%__MODULE__{
51+
category: Map.get(data, :category),
52+
variable: Map.get(data, :variable),
53+
timing: Map.get(data, :timing),
54+
label: Map.get(data, :label),
55+
timestamp: Map.get(data, :timestamp, EventsHelper.generate_timestamp()),
56+
event_id: Map.get(data, :event_id, EventsHelper.generate_uuid()),
57+
true_timestamp: Map.get(data, :true_timestamp, EventsHelper.generate_timestamp()),
58+
contexts: Map.get(data, :contexts, [])
59+
}
60+
end
61+
62+
def new(data) do
63+
raise Errors.InvalidParam, "expected map, received #{data}"
64+
end
65+
4866
@spec validate(t()) :: t() | no_return()
4967
def validate(%Timing{category: ""}) do
5068
raise Errors.InvalidParam, "category cannot be blank"

Diff for: test/snowplow_tracker/events/ecommerce_transaction_item_test.exs

+21
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,27 @@ defmodule SnowplowTracker.Events.EcommerceTransactionItemTest do
33

44
alias SnowplowTracker.{Events, Errors, Payload}
55

6+
describe "new/1" do
7+
test "returns a struct containing the appropriate fields" do
8+
event =
9+
Events.EcommerceTransactionItem.new(%{
10+
sku: "TV",
11+
price: 2301.23,
12+
quantity: 10
13+
})
14+
15+
assert event.sku == "TV"
16+
assert event.price == 2301.23
17+
assert event.quantity == 10
18+
end
19+
20+
test "raises an error on invalid input parameter" do
21+
assert_raise Errors.InvalidParam, ~r/^.*expected map.*$/, fn ->
22+
Events.EcommerceTransactionItem.new("test")
23+
end
24+
end
25+
end
26+
627
describe "validate/1" do
728
test "raises and error if sku, price or quantity is missing" do
829
assert_raise Errors.InvalidParam, ~r/^.*sku cannot be empty.*$/, fn ->

0 commit comments

Comments
 (0)