feat: refactor to PublisherMiddlewareEventParams

This commit is contained in:
Kevin Franklin Kim 2024-10-01 08:14:36 +02:00
parent 38715a58b6
commit beb6082670
No known key found for this signature in database
5 changed files with 136 additions and 28 deletions

View File

@ -22,22 +22,16 @@ import (
"go.uber.org/zap/zaptest"
)
func TestPublisher(t *testing.T) {
func TestPublisherPublisherMiddlewareIgnoreError(t *testing.T) {
l := zaptest.NewLogger(t)
var done atomic.Bool
s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
out, err := io.ReadAll(r.Body)
assert.NoError(t, err)
expected := `{"client_id":"C123456","user_id":"U123456","timestamp_micros":1727701064057701,"events":[{"name":"page_view","params":{"debug_mode":true,"session_id":"S123456","engagement_time_msec":100,"page_title":"Home","page_location":"https://foomo.org"}}]}`
if !assert.JSONEq(t, expected, string(out)) {
fmt.Println(string(out))
}
http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
done.Store(true)
}))
p := mpv2.NewPublisher(l, s.URL)
p := mpv2.NewPublisher(l, s.URL, mpv2.PublisherWithMiddlewares(mpv2.PublisherMiddlewareIgnoreError))
payload := encoding.Payload[params.PageView]{
ClientID: "C123456",
@ -47,16 +41,60 @@ func TestPublisher(t *testing.T) {
Consent: nil,
Events: []sesamy.Event[params.PageView]{
event.NewPageView(params.PageView{
MPv2: &params.MPv2{
DebugMode: true,
SessionID: "S123456",
EngagementTimeMSec: 100,
},
PageTitle: "Home",
PageLocation: "https://foomo.org",
}),
},
UserData: nil,
UserData: nil,
DebugMode: true,
SessionID: "S123456",
EngagementTimeMSec: 100,
}
jsonPayload, err := json.Marshal(payload)
require.NoError(t, err)
msg := message.NewMessage(watermill.NewUUID(), jsonPayload)
err = p.Publish("foo", msg)
require.NoError(t, err)
assert.Eventually(t, done.Load, time.Second, time.Millisecond)
}
func TestPublisherMiddlewareEventParams(t *testing.T) {
l := zaptest.NewLogger(t)
var done atomic.Bool
s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
out, err := io.ReadAll(r.Body)
assert.NoError(t, err)
expected := `{"client_id":"C123456","user_id":"U123456","timestamp_micros":1727701064057701,"events":[{"name":"page_view","params":{"debug_mode":"1","engagement_time_msec":100,"page_location":"https://foomo.org","page_title":"Home","session_id":"S123456"}}]}`
if !assert.JSONEq(t, expected, string(out)) {
fmt.Println(string(out))
}
done.Store(true)
}))
p := mpv2.NewPublisher(l, s.URL, mpv2.PublisherWithMiddlewares(mpv2.PublisherMiddlewareEventParams))
payload := encoding.Payload[params.PageView]{
ClientID: "C123456",
UserID: "U123456",
TimestampMicros: 1727701064057701,
UserProperties: nil,
Consent: nil,
Events: []sesamy.Event[params.PageView]{
event.NewPageView(params.PageView{
PageTitle: "Home",
PageLocation: "https://foomo.org",
}),
},
UserData: nil,
DebugMode: true,
SessionID: "S123456",
EngagementTimeMSec: 100,
}
jsonPayload, err := json.Marshal(payload)
require.NoError(t, err)

View File

@ -16,19 +16,29 @@ func PublisherMiddlewareIgnoreError(next PublisherHandler) PublisherHandler {
}
}
func PublisherMiddlewareDebugMode(next PublisherHandler) PublisherHandler {
func PublisherMiddlewareEventParams(next PublisherHandler) PublisherHandler {
return func(l *zap.Logger, msg *message.Message) error {
var payload *mpv2.Payload[any]
if err := json.Unmarshal(msg.Payload, &payload); err != nil {
return err
}
if payload.DebugMode {
for i, event := range payload.Events {
if params, ok := event.Params.(map[string]any); ok {
for i, event := range payload.Events {
if params, ok := event.Params.(map[string]any); ok {
if payload.DebugMode {
params["debug_mode"] = "1"
payload.DebugMode = false
}
payload.Events[i] = event
if len(payload.SessionID) > 0 {
params["session_id"] = payload.SessionID
payload.SessionID = ""
}
if payload.EngagementTimeMSec > 0 {
params["engagement_time_msec"] = payload.EngagementTimeMSec
payload.EngagementTimeMSec = 0
}
event.Params = params
}
payload.Events[i] = event
out, err := json.Marshal(payload)
if err != nil {

View File

@ -0,0 +1,68 @@
package mpv2_test
import (
"encoding/json"
"fmt"
"io"
"net/http"
"net/http/httptest"
"sync/atomic"
"testing"
"time"
"github.com/ThreeDotsLabs/watermill"
"github.com/ThreeDotsLabs/watermill/message"
"github.com/foomo/sesamy-go/integration/watermill/mpv2"
encoding "github.com/foomo/sesamy-go/pkg/encoding/mpv2"
"github.com/foomo/sesamy-go/pkg/event"
"github.com/foomo/sesamy-go/pkg/event/params"
"github.com/foomo/sesamy-go/pkg/sesamy"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.uber.org/zap/zaptest"
)
func TestPublisher(t *testing.T) {
l := zaptest.NewLogger(t)
var done atomic.Bool
s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
out, err := io.ReadAll(r.Body)
assert.NoError(t, err)
expected := `{"client_id":"C123456","user_id":"U123456","timestamp_micros":1727701064057701,"events":[{"name":"page_view","params":{"page_title":"Home","page_location":"https://foomo.org"}}],"debug_mode":true,"session_id":"S123456","engagement_time_msec":100}`
if !assert.JSONEq(t, expected, string(out)) {
fmt.Println(string(out))
}
done.Store(true)
}))
p := mpv2.NewPublisher(l, s.URL)
payload := encoding.Payload[params.PageView]{
ClientID: "C123456",
UserID: "U123456",
TimestampMicros: 1727701064057701,
UserProperties: nil,
Consent: nil,
Events: []sesamy.Event[params.PageView]{
event.NewPageView(params.PageView{
PageTitle: "Home",
PageLocation: "https://foomo.org",
}),
},
UserData: nil,
DebugMode: true,
SessionID: "S123456",
EngagementTimeMSec: 100,
}
jsonPayload, err := json.Marshal(payload)
require.NoError(t, err)
msg := message.NewMessage(watermill.NewUUID(), jsonPayload)
err = p.Publish("foo", msg)
require.NoError(t, err)
assert.Eventually(t, done.Load, time.Second, time.Millisecond)
}

View File

@ -6,7 +6,6 @@ import (
// AddToCart https://developers.google.com/analytics/devguides/collection/protocol/ga4/reference/events#add_to_cart
type AddToCart[I any] struct {
*MPv2 `json:",inline"`
Currency iso4217.Currency `json:"currency,omitempty"`
Value float64 `json:"value,omitempty"`
Items []I `json:"items,omitempty"`

View File

@ -2,13 +2,6 @@ package params
// PageView https://developers.google.com/analytics/devguides/collection/ga4/views?client_type=gtag#manually_send_page_view_events
type PageView struct {
*MPv2 `json:",inline"`
PageTitle string `json:"page_title,omitempty"`
PageLocation string `json:"page_location,omitempty"`
}
type MPv2 struct {
DebugMode bool `json:"debug_mode,omitempty"`
SessionID string `json:"session_id,omitempty"`
EngagementTimeMSec int64 `json:"engagement_time_msec,omitempty"`
}