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  }