1 package services
2
3 import (
4 "context"
5 "net/http"
6 "net/http/httptest"
7 "testing"
8
9 "github.com/gin-gonic/gin"
10 "github.com/stretchr/testify/assert"
11 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
12 "k8s.io/apimachinery/pkg/types"
13 "sigs.k8s.io/controller-runtime/pkg/client"
14 "sigs.k8s.io/controller-runtime/pkg/client/fake"
15
16 api "edge-infra.dev/pkg/edge/device-registrar/api/v1alpha1"
17 )
18
19 func injectmockClientDelete(router *gin.Engine, mockClient client.Client, t *testing.T) {
20 router.Use(
21
22 func(c *gin.Context) {
23 c.Set("k8sClient", mockClient)
24 c.Next()
25
26 k8sClient, exists := c.Get("k8sClient")
27
28
29 assert.True(t, exists, "k8sClient should exist in the context")
30 assert.NotNil(t, k8sClient, "k8sClient should not be nil")
31 },
32 )
33 }
34
35 func TestDeleteDeviceEndpoint(t *testing.T) {
36 router, scheme := setupTest()
37 mockClient := GenerateMockClient(scheme, "")
38 injectmockClientDelete(router, mockClient, t)
39
40
41 router.Use(func(c *gin.Context) {
42 c.Set("k8sClient", mockClient)
43 c.Next()
44 })
45
46
47 router.DELETE("/devices/:name", func(c *gin.Context) {
48 DeleteDeviceService(c)
49 c.Status(http.StatusNoContent)
50 })
51
52
53 ctx := context.TODO()
54
55
56 device := &api.ExternalDevice{
57 ObjectMeta: metav1.ObjectMeta{
58 Name: "test-device-name",
59 Namespace: "device-registrar-clients",
60 },
61 Spec: api.ExternalDeviceSpec{
62 Name: "test-device-name",
63 },
64 }
65 err := mockClient.Create(ctx, device)
66 assert.NoError(t, err)
67
68
69 retrievedDevice := &api.ExternalDevice{}
70 err = mockClient.Get(ctx, types.NamespacedName{Name: "test-device-name", Namespace: "device-registrar-clients"}, retrievedDevice)
71 assert.NoError(t, err)
72
73
74 req, err := http.NewRequest(http.MethodDelete, "/devices/test-device-name", nil)
75 assert.NoError(t, err)
76
77
78 w := httptest.NewRecorder()
79
80
81 router.ServeHTTP(w, req)
82
83
84 assert.Equal(t, http.StatusNoContent, w.Code)
85
86
87 err = mockClient.Get(ctx, types.NamespacedName{Name: "test-device-name", Namespace: "device-registrar-clients"}, retrievedDevice)
88 assert.Error(t, err)
89 assert.True(t, client.IgnoreNotFound(err) == nil)
90 }
91
92 func TestDeleteDeviceNotFound(t *testing.T) {
93 router, scheme := setupTest()
94 mockClient := GenerateMockClient(scheme, "")
95 injectmockClientDelete(router, mockClient, t)
96
97
98 router.Use(func(c *gin.Context) {
99 c.Set("k8sClient", mockClient)
100 c.Next()
101 })
102
103
104 router.DELETE("/devices/:name", func(c *gin.Context) {
105 DeleteDeviceService(c)
106 c.Status(http.StatusNoContent)
107 })
108
109
110 req, err := http.NewRequest(http.MethodDelete, "/devices/test-device-name", nil)
111 assert.NoError(t, err)
112
113
114 w := httptest.NewRecorder()
115
116
117 router.ServeHTTP(w, req)
118
119
120 assert.Equal(t, http.StatusNotFound, w.Code)
121 }
122
123 func TestDeleteDeviceNoName(t *testing.T) {
124 router, scheme := setupTest()
125 mockClient := fake.NewClientBuilder().WithScheme(scheme).Build()
126 injectmockClientDelete(router, mockClient, t)
127
128
129 router.DELETE("/devices/", func(c *gin.Context) {
130 DeleteDeviceService(c)
131 c.Status(http.StatusBadRequest)
132 })
133
134
135 req, err := http.NewRequest(http.MethodDelete, "/devices/", nil)
136 assert.NoError(t, err)
137
138
139 w := httptest.NewRecorder()
140
141
142 router.ServeHTTP(w, req)
143
144
145 assert.Equal(t, http.StatusBadRequest, w.Code)
146 assert.JSONEq(t, `{"error":"name is required"}`, w.Body.String())
147 }
148
View as plain text