Skip to content

Commit 7c1fbd1

Browse files
committed
Adding a simple dataref extension, similar to the java sdk
Signed-off-by: Matthias Wessendorf <[email protected]>
1 parent 4cc6c2d commit 7c1fbd1

File tree

2 files changed

+118
-0
lines changed

2 files changed

+118
-0
lines changed

v2/extensions/dataref_extension.go

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/*
2+
Copyright 2024 The CloudEvents Authors
3+
SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package extensions
7+
8+
import (
9+
"github.com/cloudevents/sdk-go/v2/event"
10+
"github.com/cloudevents/sdk-go/v2/types"
11+
"net/url"
12+
)
13+
14+
const DataRefExtensionKey = "dataref"
15+
16+
type DataRefExtension struct {
17+
DataRef *url.URL `json:"dataref"`
18+
}
19+
20+
func AddDataRefExtension(e *event.Event, dataRef string) error {
21+
parsedURL, err := url.Parse(dataRef)
22+
if err != nil {
23+
return err
24+
}
25+
26+
e.SetExtension(DataRefExtensionKey, parsedURL.String())
27+
return nil
28+
}
29+
30+
func GetDataRefExtension(e event.Event) (DataRefExtension, bool) {
31+
if dataRefValue, ok := e.Extensions()[DataRefExtensionKey]; ok {
32+
if dataRefStr, err := types.ToString(dataRefValue); err == nil {
33+
parsedURL, err := url.Parse(dataRefStr)
34+
if err != nil {
35+
return DataRefExtension{}, false
36+
}
37+
return DataRefExtension{DataRef: parsedURL}, true
38+
}
39+
}
40+
return DataRefExtension{}, false
41+
}
+77
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
/*
2+
Copyright 2024 The CloudEvents Authors
3+
SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package extensions
7+
8+
import (
9+
"net/url"
10+
"testing"
11+
12+
"github.com/cloudevents/sdk-go/v2/event"
13+
)
14+
15+
func TestAddDataRefExtensionValidURL(t *testing.T) {
16+
e := event.New()
17+
expectedDataRef := "https://example.com/data"
18+
19+
err := AddDataRefExtension(&e, expectedDataRef)
20+
if err != nil {
21+
t.Fatalf("Failed to add DataRefExtension with valid URL: %s", err)
22+
}
23+
}
24+
25+
func TestAddDataRefExtensionInvalidURL(t *testing.T) {
26+
e := event.New()
27+
invalidDataRef := "://invalid-url"
28+
29+
err := AddDataRefExtension(&e, invalidDataRef)
30+
if err == nil {
31+
t.Fatal("Expected error when adding DataRefExtension with invalid URL, but got none")
32+
}
33+
}
34+
35+
func TestGetDataRefExtensionNotFound(t *testing.T) {
36+
e := event.New()
37+
38+
_, ok := GetDataRefExtension(e)
39+
if ok {
40+
t.Fatal("Expected not to find DataRefExtension, but did")
41+
}
42+
}
43+
44+
func TestSerializationAndDeserialization(t *testing.T) {
45+
e := event.New()
46+
dataRef := "https://example.com/data"
47+
48+
err := AddDataRefExtension(&e, dataRef)
49+
if err != nil {
50+
t.Fatalf("Failed to add DataRefExtension: %s", err)
51+
}
52+
53+
bytes, err := e.MarshalJSON()
54+
if err != nil {
55+
t.Fatalf("Failed to marshal event with DataRefExtension: %s", err)
56+
}
57+
58+
var deserializedEvent event.Event
59+
err = deserializedEvent.UnmarshalJSON(bytes)
60+
if err != nil {
61+
t.Fatalf("Failed to unmarshal event with DataRefExtension: %s", err)
62+
}
63+
64+
dataRefExtension, ok := GetDataRefExtension(deserializedEvent)
65+
if !ok {
66+
t.Fatal("Expected to find DataRefExtension after deserialization, but did not")
67+
}
68+
69+
expectedURL, err := url.Parse(dataRef)
70+
if err != nil {
71+
t.Fatalf("Failed to parse expected DataRef URL: %s", err)
72+
}
73+
74+
if dataRefExtension.DataRef.String() != expectedURL.String() {
75+
t.Errorf("Expected DataRefExtension.DataRef to be '%s', but got '%s' after deserialization", expectedURL, dataRefExtension.DataRef)
76+
}
77+
}

0 commit comments

Comments
 (0)