master
go 134 lines 3.35 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package confgroup
4
5 import (
6 "sort"
7 "testing"
8
9 "github.com/stretchr/testify/assert"
10 )
11
12 func TestConfigCache_Add(t *testing.T) {
13 tests := map[string]struct {
14 prepareGroups []Group
15 groups []Group
16 expectedAdd []Config
17 expectedRemove []Config
18 }{
19 "new group, new configs": {
20 groups: []Group{
21 prepareGroup("source", prepareCfg("name", "module")),
22 },
23 expectedAdd: []Config{
24 prepareCfg("name", "module"),
25 },
26 },
27 "several equal updates for the same group": {
28 groups: []Group{
29 prepareGroup("source", prepareCfg("name", "module")),
30 prepareGroup("source", prepareCfg("name", "module")),
31 prepareGroup("source", prepareCfg("name", "module")),
32 prepareGroup("source", prepareCfg("name", "module")),
33 prepareGroup("source", prepareCfg("name", "module")),
34 },
35 expectedAdd: []Config{
36 prepareCfg("name", "module"),
37 },
38 },
39 "empty group update for cached group": {
40 prepareGroups: []Group{
41 prepareGroup("source", prepareCfg("name1", "module"), prepareCfg("name2", "module")),
42 },
43 groups: []Group{
44 prepareGroup("source"),
45 },
46 expectedRemove: []Config{
47 prepareCfg("name1", "module"),
48 prepareCfg("name2", "module"),
49 },
50 },
51 "changed group update for cached group": {
52 prepareGroups: []Group{
53 prepareGroup("source", prepareCfg("name1", "module"), prepareCfg("name2", "module")),
54 },
55 groups: []Group{
56 prepareGroup("source", prepareCfg("name2", "module")),
57 },
58 expectedRemove: []Config{
59 prepareCfg("name1", "module"),
60 },
61 },
62 "empty group update for uncached group": {
63 groups: []Group{
64 prepareGroup("source"),
65 prepareGroup("source"),
66 },
67 },
68 "several updates with different source but same context": {
69 groups: []Group{
70 prepareGroup("source1", prepareCfg("name1", "module"), prepareCfg("name2", "module")),
71 prepareGroup("source2", prepareCfg("name1", "module"), prepareCfg("name2", "module")),
72 },
73 expectedAdd: []Config{
74 prepareCfg("name1", "module"),
75 prepareCfg("name2", "module"),
76 },
77 },
78 "have equal configs from 2 sources, get empty group for the 1st source": {
79 prepareGroups: []Group{
80 prepareGroup("source1", prepareCfg("name1", "module"), prepareCfg("name2", "module")),
81 prepareGroup("source2", prepareCfg("name1", "module"), prepareCfg("name2", "module")),
82 },
83 groups: []Group{
84 prepareGroup("source2"),
85 },
86 },
87 }
88
89 for name, test := range tests {
90 t.Run(name, func(t *testing.T) {
91 cache := NewCache()
92
93 for _, group := range test.prepareGroups {
94 cache.Add(&group)
95 }
96
97 var added, removed []Config
98 for _, group := range test.groups {
99 a, r := cache.Add(&group)
100 added = append(added, a...)
101 removed = append(removed, r...)
102 }
103
104 sortConfigs(added)
105 sortConfigs(removed)
106 sortConfigs(test.expectedAdd)
107 sortConfigs(test.expectedRemove)
108
109 assert.Equalf(t, test.expectedAdd, added, "added configs")
110 assert.Equalf(t, test.expectedRemove, removed, "removed configs")
111 })
112 }
113 }
114
115 func prepareGroup(source string, cfgs ...Config) Group {
116 return Group{
117 Configs: cfgs,
118 Source: source,
119 }
120 }
121
122 func prepareCfg(name, module string) Config {
123 return Config{
124 "name": name,
125 "module": module,
126 }
127 }
128
129 func sortConfigs(cfgs []Config) {
130 if len(cfgs) == 0 {
131 return
132 }
133 sort.Slice(cfgs, func(i, j int) bool { return cfgs[i].FullName() < cfgs[j].FullName() })
134 }