github.com/ActiveState/cli@v0.0.0-20240508170324-6801f60cd051/pkg/platform/runtime/buildexpression/merge/merge_test.go (about) 1 package merge 2 3 import ( 4 "testing" 5 6 "github.com/ActiveState/cli/pkg/platform/api/mono/mono_models" 7 "github.com/ActiveState/cli/pkg/platform/runtime/buildscript" 8 "github.com/stretchr/testify/assert" 9 "github.com/stretchr/testify/require" 10 ) 11 12 func TestMergeAdd(t *testing.T) { 13 scriptA, err := buildscript.New([]byte( 14 `at_time = "2000-01-01T00:00:00.000Z" 15 runtime = solve( 16 at_time = at_time, 17 platforms = [ 18 "12345", 19 "67890" 20 ], 21 requirements = [ 22 Req(name = "perl", namespace = "language"), 23 Req(name = "DateTime", namespace = "language/perl") 24 ] 25 ) 26 27 main = runtime`)) 28 require.NoError(t, err) 29 exprA := scriptA.Expr 30 31 scriptB, err := buildscript.New([]byte( 32 `at_time = "2000-01-01T00:00:00.000Z" 33 runtime = solve( 34 at_time = at_time, 35 platforms = [ 36 "12345", 37 "67890" 38 ], 39 requirements = [ 40 Req(name = "perl", namespace = "language"), 41 Req(name = "JSON", namespace = "language/perl") 42 ] 43 ) 44 45 main = runtime`)) 46 require.NoError(t, err) 47 exprB := scriptB.Expr 48 49 strategies := &mono_models.MergeStrategies{ 50 OverwriteChanges: []*mono_models.CommitChangeEditable{ 51 {Namespace: "language/perl", Requirement: "DateTime", Operation: mono_models.CommitChangeEditableOperationAdded}, 52 }, 53 } 54 55 require.True(t, isAutoMergePossible(exprA, exprB)) 56 57 mergedExpr, err := Merge(exprA, exprB, strategies) 58 require.NoError(t, err) 59 60 mergedScript, err := buildscript.NewFromBuildExpression(scriptA.AtTime, mergedExpr) 61 require.NoError(t, err) 62 63 assert.Equal(t, 64 `at_time = "2000-01-01T00:00:00.000Z" 65 runtime = solve( 66 at_time = at_time, 67 platforms = [ 68 "12345", 69 "67890" 70 ], 71 requirements = [ 72 Req(name = "perl", namespace = "language"), 73 Req(name = "JSON", namespace = "language/perl"), 74 Req(name = "DateTime", namespace = "language/perl") 75 ] 76 ) 77 78 main = runtime`, mergedScript.String()) 79 } 80 81 func TestMergeRemove(t *testing.T) { 82 scriptA, err := buildscript.New([]byte( 83 `at_time = "2000-01-01T00:00:00.000Z" 84 runtime = solve( 85 at_time = at_time, 86 platforms = [ 87 "12345", 88 "67890" 89 ], 90 requirements = [ 91 Req(name = "perl", namespace = "language"), 92 Req(name = "DateTime", namespace = "language/perl") 93 ] 94 ) 95 96 main = runtime`)) 97 require.NoError(t, err) 98 exprA := scriptA.Expr 99 100 scriptB, err := buildscript.New([]byte( 101 `at_time = "2000-01-01T00:00:00.000Z" 102 runtime = solve( 103 at_time = at_time, 104 platforms = [ 105 "12345", 106 "67890" 107 ], 108 requirements = [ 109 Req(name = "perl", namespace = "language"), 110 Req(name = "JSON", namespace = "language/perl"), 111 Req(name = "DateTime", namespace = "language/perl") 112 ] 113 ) 114 115 main = runtime`)) 116 require.NoError(t, err) 117 exprB := scriptB.Expr 118 119 strategies := &mono_models.MergeStrategies{ 120 OverwriteChanges: []*mono_models.CommitChangeEditable{ 121 {Namespace: "language/perl", Requirement: "JSON", Operation: mono_models.CommitChangeEditableOperationRemoved}, 122 }, 123 } 124 125 require.True(t, isAutoMergePossible(exprA, exprB)) 126 127 mergedExpr, err := Merge(exprA, exprB, strategies) 128 require.NoError(t, err) 129 130 mergedScript, err := buildscript.NewFromBuildExpression(scriptA.AtTime, mergedExpr) 131 require.NoError(t, err) 132 133 assert.Equal(t, 134 `at_time = "2000-01-01T00:00:00.000Z" 135 runtime = solve( 136 at_time = at_time, 137 platforms = [ 138 "12345", 139 "67890" 140 ], 141 requirements = [ 142 Req(name = "perl", namespace = "language"), 143 Req(name = "DateTime", namespace = "language/perl") 144 ] 145 ) 146 147 main = runtime`, mergedScript.String()) 148 } 149 150 func TestMergeConflict(t *testing.T) { 151 scriptA, err := buildscript.New([]byte( 152 `at_time = "2000-01-01T00:00:00.000Z" 153 runtime = solve( 154 at_time = at_time, 155 platforms = [ 156 "12345", 157 "67890" 158 ], 159 requirements = [ 160 Req(name = "perl", namespace = "language"), 161 ] 162 ) 163 164 main = runtime`)) 165 require.NoError(t, err) 166 exprA := scriptA.Expr 167 168 scriptB, err := buildscript.New([]byte( 169 `at_time = "2000-01-01T00:00:00.000Z" 170 runtime = solve( 171 at_time = at_time, 172 platforms = [ 173 "12345" 174 ], 175 requirements = [ 176 Req(name = "perl", namespace = "language"), 177 Req(name = "JSON", namespace = "language/perl") 178 ] 179 ) 180 181 main = runtime`)) 182 require.NoError(t, err) 183 exprB := scriptB.Expr 184 185 assert.False(t, isAutoMergePossible(exprA, exprB)) // platforms do not match 186 187 _, err = Merge(exprA, exprB, nil) 188 require.Error(t, err) 189 } 190 191 func TestDeleteKey(t *testing.T) { 192 m := map[string]interface{}{"foo": map[string]interface{}{"bar": "baz", "quux": "foobar"}} 193 assert.True(t, deleteKey(&m, "quux"), "did not find quux") 194 _, exists := m["foo"].(map[string]interface{})["quux"] 195 assert.False(t, exists, "did not delete quux") 196 }