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  }