github.com/simpleiot/simpleiot@v0.18.3/client/node_test.go (about) 1 package client_test 2 3 import ( 4 "fmt" 5 "log" 6 "testing" 7 8 "github.com/goccy/go-yaml" 9 "github.com/simpleiot/simpleiot/client" 10 "github.com/simpleiot/simpleiot/data" 11 "github.com/simpleiot/simpleiot/server" 12 ) 13 14 // FIXME, need tests for duplicate, move, and mirror node 15 16 func TestExportNodes(t *testing.T) { 17 nc, root, stop, err := server.TestServer() 18 19 if err != nil { 20 t.Fatal("Error starting test server: ", err) 21 } 22 23 defer stop() 24 25 y, err := client.ExportNodes(nc, root.ID) 26 27 if err != nil { 28 t.Fatal("Error exporting nodes: ", err) 29 } 30 31 // convert back to nodes and check a few 32 var exp client.SiotExport 33 34 err = yaml.Unmarshal(y, &exp) 35 if err != nil { 36 t.Fatal("Unmarshal error: ", err) 37 } 38 39 if len(exp.Nodes) < 1 { 40 t.Fatal("no top level node") 41 } 42 43 if len(exp.Nodes[0].Children) < 1 { 44 t.Fatal("no child nodes") 45 } 46 47 if exp.Nodes[0].Type != data.NodeTypeDevice { 48 t.Fatal("top level node should be device") 49 } 50 51 if exp.Nodes[0].Children[0].Type != data.NodeTypeUser { 52 t.Fatal("child node is not user type") 53 } 54 } 55 56 func TestExportImportNodes(t *testing.T) { 57 nc, root, stop, err := server.TestServer() 58 59 if err != nil { 60 t.Fatal("Error starting test server: ", err) 61 } 62 63 defer stop() 64 65 ne, err := client.UserCheck(nc, "admin", "admin") 66 if err != nil { 67 t.Fatal("User check error: ", err) 68 } 69 70 if len(ne) != 2 { 71 t.Fatal("Expected exactly nodes from auth request") 72 } 73 74 y, err := client.ExportNodes(nc, root.ID) 75 76 if err != nil { 77 t.Fatal("Error exporting nodes: ", err) 78 } 79 80 // fmt.Println("export: ", string(y)) 81 82 err = client.ImportNodes(nc, "root", y, "test", false) 83 84 if err != nil { 85 t.Fatal("Error importing nodes: ", err) 86 } 87 88 // check to make sure original device node has been tombstoned 89 ne, err = client.GetNodes(nc, "all", "inst1", "", false) 90 if err != nil { 91 t.Fatal("Error getting original device node: ", err) 92 } 93 94 if len(ne) > 0 { 95 t.Fatal("Original devices node was not deleted") 96 } 97 98 // check user auth check 99 ne, err = client.UserCheck(nc, "admin", "admin") 100 if err != nil { 101 t.Fatal("User check error: ", err) 102 } 103 104 // should return exactly 2 nodes, a user and jwt node 105 if len(ne) != 2 { 106 fmt.Println("ne: ", ne) 107 t.Fatal("Expected at exactly two nodes from auth request, got: ", len(ne)) 108 } 109 110 userNodeFound := false 111 112 for _, n := range ne { 113 if n.Type == data.NodeTypeUser { 114 userNodeFound = true 115 116 nodes, err := client.GetNodesForUser(nc, n.ID) 117 if err != nil { 118 log.Println("Error getting nodes for user:", err) 119 } 120 121 // there should be two nodes in the new system -- a device and user node 122 if len(nodes) != 2 { 123 fmt.Println("nodes for user: ", nodes) 124 t.Fatal("Should be exactly 2 nodes for user after import, got: ", len(nodes)) 125 } 126 } 127 } 128 129 if !userNodeFound { 130 t.Fatal("User node not found") 131 } 132 133 ne, err = client.GetNodes(nc, "root", "all", "", false) 134 if err != nil { 135 t.Fatal("error getting nodes: ", err) 136 } 137 138 if len(ne) != 1 { 139 t.Fatal("Expected only one device node") 140 } 141 142 // make sure the device node is new, and not the original 143 if ne[0].ID == "inst1" { 144 t.Fatal("ID is not the new ID, but rather the test ID of the original node") 145 } 146 } 147 148 var testImportNodesYaml = ` 149 nodes: 150 - type: group 151 points: 152 - type: description 153 text: "group 1" 154 children: 155 - type: variable 156 points: 157 - type: description 158 text: var 1 159 - type: value 160 value: 10 161 ` 162 163 func TestImportNodes(t *testing.T) { 164 nc, root, stop, err := server.TestServer() 165 166 if err != nil { 167 t.Fatal("Error starting test server: ", err) 168 } 169 170 defer stop() 171 172 // make sure we can't import at a bogus place 173 err = client.ImportNodes(nc, "bogusrootid", []byte(testImportNodesYaml), "test", false) 174 if err == nil { 175 t.Fatal("Should have gotten an error importing at bogus location") 176 } 177 178 err = client.ImportNodes(nc, root.ID, []byte(testImportNodesYaml), "test", false) 179 if err != nil { 180 t.Fatal("Error importing: ", err) 181 } 182 183 children, err := client.GetNodes(nc, root.ID, "all", "", false) 184 if err != nil { 185 t.Fatal("Error getting children: ", err) 186 } 187 188 if len(children) < 2 { 189 t.Fatal("Should be at least 2 children") 190 } 191 192 var g data.NodeEdge 193 194 for _, c := range children { 195 if c.Type == data.NodeTypeGroup { 196 g = c 197 break 198 } 199 } 200 201 if g.Type != data.NodeTypeGroup { 202 t.Fatal("group node not found") 203 } 204 205 children, err = client.GetNodes(nc, g.ID, "all", "", false) 206 if err != nil { 207 t.Fatal("error getting group children") 208 } 209 210 if len(children) < 1 { 211 t.Fatal("Group should have at least 1 child") 212 } 213 } 214 215 var testImportNodesYamlWithIDs = ` 216 nodes: 217 - type: group 218 id: 111 219 points: 220 - type: description 221 text: "group 1" 222 children: 223 - type: variable 224 id: 222 225 parent: 111 226 points: 227 - type: description 228 text: var 1 229 - type: value 230 value: 10 231 ` 232 233 func TestImportNodesPreserveIDs(t *testing.T) { 234 nc, root, stop, err := server.TestServer() 235 236 if err != nil { 237 t.Fatal("Error starting test server: ", err) 238 } 239 240 defer stop() 241 242 err = client.ImportNodes(nc, root.ID, []byte(testImportNodesYamlWithIDs), "test", true) 243 if err != nil { 244 t.Fatal("Error importing: ", err) 245 } 246 247 children, err := client.GetNodes(nc, root.ID, "all", "", false) 248 if err != nil { 249 t.Fatal("Error getting children: ", err) 250 } 251 252 var g data.NodeEdge 253 254 for _, c := range children { 255 if c.Type == data.NodeTypeGroup { 256 g = c 257 break 258 } 259 } 260 261 if g.Type != data.NodeTypeGroup { 262 t.Fatal("group node not found") 263 } 264 265 if g.ID != "111" { 266 t.Fatal("did not get expected group ID") 267 } 268 269 children, err = client.GetNodes(nc, g.ID, "all", "", false) 270 if err != nil { 271 t.Fatal("error getting group children") 272 } 273 274 if len(children) < 1 { 275 t.Fatal("Group should have at least 1 child") 276 } 277 278 } 279 280 var testImportNodesYamlBadParent = ` 281 nodes: 282 - type: group 283 id: 111 284 points: 285 - type: description 286 text: "group 1" 287 children: 288 - type: variable 289 id: 222 290 parent: 123 291 points: 292 - type: description 293 text: var 1 294 - type: value 295 value: 10 296 ` 297 298 func TestImportNodesBadParent(t *testing.T) { 299 nc, root, stop, err := server.TestServer() 300 301 if err != nil { 302 t.Fatal("Error starting test server: ", err) 303 } 304 305 defer stop() 306 307 err = client.ImportNodes(nc, root.ID, []byte(testImportNodesYamlBadParent), "test", true) 308 if err == nil { 309 t.Fatal("should have caught bad parent") 310 } 311 } 312 313 func TestReplaceIDs(t *testing.T) { 314 testNodes := data.NodeEdgeChildren{ 315 NodeEdge: data.NodeEdge{ 316 ID: "123", 317 Type: "testType", 318 Points: []data.Point{ 319 {Type: "nodeID", Text: "", Key: "0"}, 320 }, 321 }, 322 Children: []data.NodeEdgeChildren{ 323 {NodeEdge: data.NodeEdge{ 324 ID: "", 325 Type: "testY", 326 Points: []data.Point{ 327 {Type: "description", Text: "test Y1", Key: "2"}, 328 {Type: "nodeID", Text: "123", Key: "0"}, 329 }, 330 EdgePoints: []data.Point{ 331 {Type: "role", Text: "user"}, 332 }, 333 }, 334 Children: []data.NodeEdgeChildren{ 335 {NodeEdge: data.NodeEdge{ 336 ID: "123", 337 Type: "testY", 338 Points: []data.Point{ 339 {Type: "description", Text: "test Y2"}, 340 }, 341 }, Children: nil}, 342 }, 343 }, 344 {NodeEdge: data.NodeEdge{ 345 ID: "", 346 Type: "testY", 347 Points: []data.Point{ 348 {Type: "description", Text: "test Y1", Key: "2"}, 349 {Type: "nodeID", Text: "123", Key: "0"}, 350 }, 351 EdgePoints: []data.Point{ 352 {Type: "role", Text: "user"}, 353 }, 354 }, 355 Children: nil, 356 }, 357 }, 358 } 359 360 client.ReplaceIDs(&testNodes, "parent123") 361 362 if testNodes.ID == "123" { 363 t.Fatal("ID not replaced") 364 } 365 366 if testNodes.Children[0].ID == "abc" { 367 t.Fatal("child ID not replaced") 368 } 369 370 // make sure nodes occur in multiple places, they have the same IDs 371 if testNodes.ID != testNodes.Children[0].Children[0].ID { 372 t.Fatal("123 IDs did not get replaced with the same value") 373 } 374 375 // mode sure any points of type nodeID get updated 376 if testNodes.Children[0].Points[1].Text == "123" { 377 t.Fatal("Points of type nodeID are not getting updated") 378 } 379 380 // make sure blank ids are handled correctly 381 if testNodes.Children[0].ID == testNodes.Children[1].ID { 382 t.Fatal("Blank node IDs not handled correctly") 383 } 384 385 // mode sure blank nodeID points are ignored 386 if testNodes.Points[0].Text != "" { 387 t.Fatal("Blank nodeID point not ignored") 388 } 389 390 if testNodes.Parent != "parent123" { 391 t.Fatal("top level parent not correct") 392 } 393 394 if testNodes.ID != testNodes.Children[0].Parent { 395 t.Fatal("child parent not correct") 396 } 397 }