...

Source file src/edge-infra.dev/pkg/lib/ini/section_test.go

Documentation: edge-infra.dev/pkg/lib/ini

     1  package ini
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/stretchr/testify/assert"
     7  	"github.com/stretchr/testify/require"
     8  )
     9  
    10  func TestSection_SetBody(t *testing.T) {
    11  	t.Run("set body of raw section", func(t *testing.T) {
    12  		f := Empty()
    13  		require.NotNil(t, f)
    14  
    15  		sec, err := f.NewRawSection("comments", `1111111111111111111000000000000000001110000
    16  111111111111111111100000000000111000000000`)
    17  		require.NoError(t, err)
    18  		require.NotNil(t, sec)
    19  		assert.Equal(t, `1111111111111111111000000000000000001110000
    20  111111111111111111100000000000111000000000`, sec.Body())
    21  
    22  		sec.SetBody("1111111111111111111000000000000000001110000")
    23  		assert.Equal(t, `1111111111111111111000000000000000001110000`, sec.Body())
    24  
    25  		t.Run("set for non-raw section", func(t *testing.T) {
    26  			sec, err := f.NewSection("author")
    27  			require.NoError(t, err)
    28  			require.NotNil(t, sec)
    29  			assert.Empty(t, sec.Body())
    30  
    31  			sec.SetBody("1111111111111111111000000000000000001110000")
    32  			assert.Empty(t, sec.Body())
    33  		})
    34  	})
    35  }
    36  
    37  func TestSection_NewKey(t *testing.T) {
    38  	t.Run("create a new key", func(t *testing.T) {
    39  		f := Empty()
    40  		require.NotNil(t, f)
    41  
    42  		k, err := f.Section("").NewKey("NAME", "ini")
    43  		require.NoError(t, err)
    44  		require.NotNil(t, k)
    45  		assert.Equal(t, "NAME", k.Name())
    46  		assert.Equal(t, "ini", k.Value())
    47  
    48  		t.Run("with duplicated name", func(t *testing.T) {
    49  			k, err := f.Section("").NewKey("NAME", "ini.v1")
    50  			require.NoError(t, err)
    51  			require.NotNil(t, k)
    52  
    53  			// Overwrite previous existed key
    54  			assert.Equal(t, "ini.v1", k.Value())
    55  		})
    56  
    57  		t.Run("with empty string", func(t *testing.T) {
    58  			_, err := f.Section("").NewKey("", "")
    59  			require.Error(t, err)
    60  		})
    61  	})
    62  
    63  	t.Run("create keys with same name and allow shadow", func(t *testing.T) {
    64  		f, err := ShadowLoad([]byte(""))
    65  		require.NoError(t, err)
    66  		require.NotNil(t, f)
    67  
    68  		k, err := f.Section("").NewKey("NAME", "ini")
    69  		require.NoError(t, err)
    70  		require.NotNil(t, k)
    71  		k, err = f.Section("").NewKey("NAME", "ini.v1")
    72  		require.NoError(t, err)
    73  		require.NotNil(t, k)
    74  
    75  		assert.Equal(t, []string{"ini", "ini.v1"}, k.ValueWithShadows())
    76  	})
    77  }
    78  
    79  func TestSection_NewBooleanKey(t *testing.T) {
    80  	t.Run("create a new boolean key", func(t *testing.T) {
    81  		f := Empty()
    82  		require.NotNil(t, f)
    83  
    84  		k, err := f.Section("").NewBooleanKey("start-ssh-server")
    85  		require.NoError(t, err)
    86  		require.NotNil(t, k)
    87  		assert.Equal(t, "start-ssh-server", k.Name())
    88  		assert.Equal(t, "true", k.Value())
    89  
    90  		t.Run("with empty string", func(t *testing.T) {
    91  			_, err := f.Section("").NewBooleanKey("")
    92  			require.Error(t, err)
    93  		})
    94  	})
    95  }
    96  
    97  func TestSection_GetKey(t *testing.T) {
    98  	t.Run("get a key", func(t *testing.T) {
    99  		f := Empty()
   100  		require.NotNil(t, f)
   101  
   102  		k, err := f.Section("").NewKey("NAME", "ini")
   103  		require.NoError(t, err)
   104  		require.NotNil(t, k)
   105  
   106  		k, err = f.Section("").GetKey("NAME")
   107  		require.NoError(t, err)
   108  		require.NotNil(t, k)
   109  		assert.Equal(t, "NAME", k.Name())
   110  		assert.Equal(t, "ini", k.Value())
   111  
   112  		t.Run("key not exists", func(t *testing.T) {
   113  			_, err := f.Section("").GetKey("404")
   114  			require.Error(t, err)
   115  		})
   116  
   117  		t.Run("key exists in parent section", func(t *testing.T) {
   118  			k, err := f.Section("parent").NewKey("AGE", "18")
   119  			require.NoError(t, err)
   120  			require.NotNil(t, k)
   121  
   122  			k, err = f.Section("parent.child.son").GetKey("AGE")
   123  			require.NoError(t, err)
   124  			require.NotNil(t, k)
   125  			assert.Equal(t, "18", k.Value())
   126  		})
   127  	})
   128  }
   129  
   130  func TestSection_HasKey(t *testing.T) {
   131  	t.Run("check if a key exists", func(t *testing.T) {
   132  		f := Empty()
   133  		require.NotNil(t, f)
   134  
   135  		k, err := f.Section("").NewKey("NAME", "ini")
   136  		require.NoError(t, err)
   137  		require.NotNil(t, k)
   138  
   139  		assert.True(t, f.Section("").HasKey("NAME"))
   140  		assert.True(t, f.Section("").HasKey("NAME"))
   141  		assert.False(t, f.Section("").HasKey("404"))
   142  		assert.False(t, f.Section("").HasKey("404"))
   143  	})
   144  }
   145  
   146  func TestSection_HasValue(t *testing.T) {
   147  	t.Run("check if contains a value in any key", func(t *testing.T) {
   148  		f := Empty()
   149  		require.NotNil(t, f)
   150  
   151  		k, err := f.Section("").NewKey("NAME", "ini")
   152  		require.NoError(t, err)
   153  		require.NotNil(t, k)
   154  
   155  		assert.True(t, f.Section("").HasValue("ini"))
   156  		assert.False(t, f.Section("").HasValue("404"))
   157  	})
   158  }
   159  
   160  func TestSection_Key(t *testing.T) {
   161  	t.Run("get a key", func(t *testing.T) {
   162  		f := Empty()
   163  		require.NotNil(t, f)
   164  
   165  		k, err := f.Section("").NewKey("NAME", "ini")
   166  		require.NoError(t, err)
   167  		require.NotNil(t, k)
   168  
   169  		k = f.Section("").Key("NAME")
   170  		require.NotNil(t, k)
   171  		assert.Equal(t, "NAME", k.Name())
   172  		assert.Equal(t, "ini", k.Value())
   173  
   174  		t.Run("key not exists", func(t *testing.T) {
   175  			k := f.Section("").Key("404")
   176  			require.NotNil(t, k)
   177  			assert.Equal(t, "404", k.Name())
   178  		})
   179  
   180  		t.Run("key exists in parent section", func(t *testing.T) {
   181  			k, err := f.Section("parent").NewKey("AGE", "18")
   182  			require.NoError(t, err)
   183  			require.NotNil(t, k)
   184  
   185  			k = f.Section("parent.child.son").Key("AGE")
   186  			require.NotNil(t, k)
   187  			assert.Equal(t, "18", k.Value())
   188  		})
   189  	})
   190  }
   191  
   192  func TestSection_Keys(t *testing.T) {
   193  	t.Run("get all keys in a section", func(t *testing.T) {
   194  		f := Empty()
   195  		require.NotNil(t, f)
   196  
   197  		k, err := f.Section("").NewKey("NAME", "ini")
   198  		require.NoError(t, err)
   199  		require.NotNil(t, k)
   200  		k, err = f.Section("").NewKey("VERSION", "v1")
   201  		require.NoError(t, err)
   202  		require.NotNil(t, k)
   203  		k, err = f.Section("").NewKey("IMPORT_PATH", "gopkg.in/ini.v1")
   204  		require.NoError(t, err)
   205  		require.NotNil(t, k)
   206  
   207  		keys := f.Section("").Keys()
   208  		names := []string{"NAME", "VERSION", "IMPORT_PATH"}
   209  		assert.Equal(t, len(names), len(keys))
   210  		for i, name := range names {
   211  			assert.Equal(t, name, keys[i].Name())
   212  		}
   213  	})
   214  }
   215  
   216  func TestSection_ParentKeys(t *testing.T) {
   217  	t.Run("get all keys of parent sections", func(t *testing.T) {
   218  		f := Empty()
   219  		require.NotNil(t, f)
   220  
   221  		k, err := f.Section("package").NewKey("NAME", "ini")
   222  		require.NoError(t, err)
   223  		require.NotNil(t, k)
   224  		k, err = f.Section("package").NewKey("VERSION", "v1")
   225  		require.NoError(t, err)
   226  		require.NotNil(t, k)
   227  		k, err = f.Section("package").NewKey("IMPORT_PATH", "gopkg.in/ini.v1")
   228  		require.NoError(t, err)
   229  		require.NotNil(t, k)
   230  
   231  		keys := f.Section("package.sub.sub2").ParentKeys()
   232  		names := []string{"NAME", "VERSION", "IMPORT_PATH"}
   233  		assert.Equal(t, len(names), len(keys))
   234  		for i, name := range names {
   235  			assert.Equal(t, name, keys[i].Name())
   236  		}
   237  	})
   238  }
   239  
   240  func TestSection_KeyStrings(t *testing.T) {
   241  	t.Run("get all key names in a section", func(t *testing.T) {
   242  		f := Empty()
   243  		require.NotNil(t, f)
   244  
   245  		k, err := f.Section("").NewKey("NAME", "ini")
   246  		require.NoError(t, err)
   247  		require.NotNil(t, k)
   248  		k, err = f.Section("").NewKey("VERSION", "v1")
   249  		require.NoError(t, err)
   250  		require.NotNil(t, k)
   251  		k, err = f.Section("").NewKey("IMPORT_PATH", "gopkg.in/ini.v1")
   252  		require.NoError(t, err)
   253  		require.NotNil(t, k)
   254  
   255  		assert.Equal(t, []string{"NAME", "VERSION", "IMPORT_PATH"}, f.Section("").KeyStrings())
   256  	})
   257  }
   258  
   259  func TestSection_KeyHash(t *testing.T) {
   260  	t.Run("get clone of key hash", func(t *testing.T) {
   261  		f, err := Load([]byte(`
   262  key = one
   263  [log]
   264  name = app
   265  file = a.log
   266  `), []byte(`
   267  key = two
   268  [log]
   269  name = app2
   270  file = b.log
   271  `))
   272  		require.NoError(t, err)
   273  		require.NotNil(t, f)
   274  
   275  		assert.Equal(t, "two", f.Section("").Key("key").String())
   276  
   277  		hash := f.Section("log").KeysHash()
   278  		relation := map[string]string{
   279  			"name": "app2",
   280  			"file": "b.log",
   281  		}
   282  		for k, v := range hash {
   283  			assert.Equal(t, relation[k], v)
   284  		}
   285  	})
   286  }
   287  
   288  func TestSection_DeleteKey(t *testing.T) {
   289  	t.Run("delete a key", func(t *testing.T) {
   290  		f := Empty()
   291  		require.NotNil(t, f)
   292  
   293  		k, err := f.Section("").NewKey("NAME", "ini")
   294  		require.NoError(t, err)
   295  		require.NotNil(t, k)
   296  
   297  		assert.True(t, f.Section("").HasKey("NAME"))
   298  		f.Section("").DeleteKey("NAME")
   299  		assert.False(t, f.Section("").HasKey("NAME"))
   300  	})
   301  }
   302  

View as plain text