github.com/abolfazlbeh/zhycan@v0.0.0-20230819144214-24cf38237387/internal/http/manager_test.go (about) 1 package http 2 3 import ( 4 "errors" 5 "github.com/abolfazlbeh/zhycan/internal/config" 6 "github.com/gofiber/fiber/v2" 7 "github.com/gofiber/fiber/v2/utils" 8 "net/http/httptest" 9 "reflect" 10 "testing" 11 ) 12 13 func TestManager_Init(t *testing.T) { 14 makeReadyConfigManager() 15 16 m := manager{} 17 m.init() 18 19 if m.name != "http" { 20 t.Errorf("Expected manager name to be 'http', got '%s'", m.name) 21 } 22 if len(m.servers) == 0 { 23 t.Errorf("Expected manager to have at least one server, got '%d'", len(m.servers)) 24 } 25 } 26 27 func TestGetManager(t *testing.T) { 28 m := GetManager() 29 if m == nil { 30 t.Errorf("Expected manager instance to be not nil, got '%v'", m) 31 } 32 } 33 34 func TestManger_StartServers(t *testing.T) { 35 makeReadyConfigManager() 36 37 // Get instance of manager 38 err := GetManager().StartServers() 39 if err != nil { 40 t.Errorf("Starting HTTP Manager --> Expected: %v, but got %v", nil, err) 41 } 42 } 43 44 func TestManager_StopServers(t *testing.T) { 45 makeReadyConfigManager() 46 47 // Get instance of manager 48 err := GetManager().StopServers() 49 if err != nil { 50 t.Errorf("Stopping HTTP Manager --> Expected: %v, but got %v", nil, err) 51 } 52 } 53 54 func TestManager_CheckServerConfig(t *testing.T) { 55 makeReadyConfigManager() 56 57 // Get the first server 58 m := GetManager() 59 if len(m.servers) == 0 { 60 t.Errorf("Expected manager to have at least one server, got '%d'", len(m.servers)) 61 } 62 63 // check the configs 64 expectedAddress := ":3000" 65 if !reflect.DeepEqual(m.servers[m.defaultServer].config.ListenAddress, expectedAddress) { 66 t.Errorf("Expected the Addr of the first server to be %v, but got %v", expectedAddress, m.servers[m.defaultServer].config.ListenAddress) 67 } 68 69 expectedVal := ".gz" 70 if !reflect.DeepEqual(m.servers[m.defaultServer].config.Config.CompressedFileSuffix, expectedVal) { 71 t.Errorf("Expected the config val of the first server to be %v, but got %v", expectedVal, m.servers[m.defaultServer].config.Config.CompressedFileSuffix) 72 } 73 74 } 75 76 func TestManager_AddRoute(t *testing.T) { 77 makeReadyConfigManager() 78 79 // Get the first server 80 m := GetManager() 81 if len(m.servers) == 0 { 82 t.Errorf("Expected manager to have at least one server, got '%d'", len(m.servers)) 83 } 84 85 err := m.AddRoute(fiber.MethodGet, "/", func(c *fiber.Ctx) error { 86 return nil 87 }, "TestGet", []string{}, []string{}) 88 if err != nil { 89 t.Errorf("Adding route to server expected to return %v, but got %v", nil, err) 90 } 91 92 routes := m.servers[m.defaultServer].app.GetRoutes() 93 if len(routes) == 0 { 94 t.Errorf("Expected 1 routes added to server, but got %v", len(routes)) 95 } 96 } 97 98 func TestManager_AddRouteToSpecificServer(t *testing.T) { 99 makeReadyConfigManager() 100 101 // Get the first server 102 m := GetManager() 103 if len(m.servers) == 0 { 104 t.Errorf("Expected manager to have at least one server, got '%d'", len(m.servers)) 105 } 106 107 err := m.AddRoute(fiber.MethodGet, "/", func(c *fiber.Ctx) error { 108 return nil 109 }, "TestGet", []string{}, []string{}) 110 if err != nil { 111 t.Errorf("Adding route to server expected to return %v, but got %v", nil, err) 112 } 113 114 routes := m.servers["s1"].app.GetRoutes() 115 if len(routes) == 0 { 116 t.Errorf("Expected 1 routes added to server %v, but got %v", "s1", len(routes)) 117 } 118 } 119 120 func TestManager_GetRouteByName(t *testing.T) { 121 makeReadyConfigManager() 122 123 // Get the first server 124 m := GetManager() 125 if len(m.servers) == 0 { 126 t.Errorf("Expected manager to have at least one server, got '%d'", len(m.servers)) 127 return 128 } 129 130 serverName := "s1" 131 routeName := "TestGet" 132 err := m.AddRoute(fiber.MethodGet, "/", func(c *fiber.Ctx) error { 133 return nil 134 }, routeName, []string{}, []string{}, serverName) 135 if err != nil { 136 t.Errorf("Adding route to server expected to return %v, but got %v", nil, err) 137 return 138 } 139 140 route, err := m.GetRouteByName(routeName) 141 if err != nil { 142 t.Errorf("Error Get route of server by name, expected %v, but got %v", nil, err) 143 return 144 } 145 146 if route.Name != routeName { 147 t.Errorf("Expected to get the route name %v, but got %v", routeName, route.Name) 148 return 149 } 150 151 route1, err := m.GetRouteByName(routeName, serverName) 152 if err != nil { 153 t.Errorf("Error Get route of server by name, expected %v, but got %v", nil, err) 154 return 155 } 156 157 if route1.Name != routeName { 158 t.Errorf("Expected to get the route name %v, but got %v", routeName, route1.Name) 159 return 160 } 161 } 162 163 func TestManager_AttachErrorHandler(t *testing.T) { 164 makeReadyConfigManager() 165 166 // Get the first server 167 m := GetManager() 168 if len(m.servers) == 0 { 169 t.Errorf("Expected manager to have at least one server, got '%d'", len(m.servers)) 170 return 171 } 172 173 m.AttachErrorHandler(func(ctx *fiber.Ctx, err error) error { 174 // Status code defaults to 500 175 code := fiber.StatusInternalServerError 176 177 // Retrieve the custom status code if it's a *fiber.Error 178 var e *fiber.Error 179 if errors.As(err, &e) { 180 code = e.Code 181 } 182 183 utils.AssertEqual(t, fiber.StatusNotFound, code, "Status code") 184 ctx.Status(code).SendString(e.Error()) 185 return nil 186 }) 187 188 m.StartServers() 189 defer m.StopServers() 190 191 req := httptest.NewRequest(fiber.MethodGet, "http://127.0.0.1:3000/t", nil) 192 resp, err := m.servers["s1"].app.Test(req) 193 utils.AssertEqual(t, nil, err, "Expected to not get error") 194 utils.AssertEqual(t, 404, resp.StatusCode, "Status code") 195 } 196 197 func makeReadyConfigManager() { 198 path := "../.." 199 initialMode := "test" 200 prefix := "ZHYCAN" 201 202 _ = config.CreateManager(path, initialMode, prefix) 203 }