github.com/myhau/pulumi/pkg/v3@v3.70.2-0.20221116134521-f2775972e587/engine/lifecycletest/step_generator_test.go (about)

     1  package lifecycletest
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/blang/semver"
     7  	. "github.com/pulumi/pulumi/pkg/v3/engine"
     8  	"github.com/pulumi/pulumi/pkg/v3/resource/deploy/deploytest"
     9  	"github.com/pulumi/pulumi/sdk/v3/go/common/resource"
    10  	"github.com/pulumi/pulumi/sdk/v3/go/common/resource/plugin"
    11  	"github.com/stretchr/testify/assert"
    12  	"github.com/stretchr/testify/require"
    13  )
    14  
    15  // TestDuplicateURN tests that duplicate URNs are disallowed.
    16  func TestDuplicateURN(t *testing.T) {
    17  	t.Parallel()
    18  
    19  	loaders := []*deploytest.ProviderLoader{
    20  		deploytest.NewProviderLoader("pkgA", semver.MustParse("1.0.0"), func() (plugin.Provider, error) {
    21  			return &deploytest.Provider{}, nil
    22  		}),
    23  	}
    24  
    25  	program := deploytest.NewLanguageRuntime(func(_ plugin.RunInfo, monitor *deploytest.ResourceMonitor) error {
    26  		_, _, _, err := monitor.RegisterResource("pkgA:m:typA", "resA", true)
    27  		require.NoError(t, err)
    28  
    29  		_, _, _, err = monitor.RegisterResource("pkgA:m:typA", "resA", true)
    30  		assert.Error(t, err)
    31  
    32  		// Reads use the same URN namespace as register so make sure this also errors
    33  		_, _, err = monitor.ReadResource("pkgA:m:typA", "resA", "id", "", resource.PropertyMap{}, "", "")
    34  		assert.Error(t, err)
    35  
    36  		return nil
    37  	})
    38  	host := deploytest.NewPluginHost(nil, nil, program, loaders...)
    39  
    40  	p := &TestPlan{
    41  		Options: UpdateOptions{Host: host},
    42  	}
    43  
    44  	project := p.GetProject()
    45  	_, res := TestOp(Update).Run(project, p.GetTarget(t, nil), p.Options, false, p.BackendClient, nil)
    46  	assert.NotNil(t, res)
    47  }
    48  
    49  // TestDuplicateAlias tests that multiple new resources may not claim to be aliases for the same old resource.
    50  func TestDuplicateAlias(t *testing.T) {
    51  	t.Parallel()
    52  
    53  	loaders := []*deploytest.ProviderLoader{
    54  		deploytest.NewProviderLoader("pkgA", semver.MustParse("1.0.0"), func() (plugin.Provider, error) {
    55  			return &deploytest.Provider{}, nil
    56  		}),
    57  	}
    58  
    59  	program := func(monitor *deploytest.ResourceMonitor) error {
    60  		_, _, _, err := monitor.RegisterResource("pkgA:m:typA", "resA", true)
    61  		assert.NoError(t, err)
    62  		return nil
    63  	}
    64  
    65  	runtime := deploytest.NewLanguageRuntime(func(_ plugin.RunInfo, monitor *deploytest.ResourceMonitor) error {
    66  		return program(monitor)
    67  	})
    68  	host := deploytest.NewPluginHost(nil, nil, runtime, loaders...)
    69  
    70  	p := &TestPlan{
    71  		Options: UpdateOptions{Host: host},
    72  	}
    73  	resURN := p.NewURN("pkgA:m:typA", "resA", "")
    74  
    75  	project := p.GetProject()
    76  	snap, res := TestOp(Update).Run(project, p.GetTarget(t, nil), p.Options, false, p.BackendClient, nil)
    77  	assert.Nil(t, res)
    78  
    79  	program = func(monitor *deploytest.ResourceMonitor) error {
    80  		_, _, _, err := monitor.RegisterResource("pkgA:m:typA", "resB", true, deploytest.ResourceOptions{
    81  			AliasURNs: []resource.URN{resURN},
    82  		})
    83  		require.NoError(t, err)
    84  
    85  		_, _, _, err = monitor.RegisterResource("pkgA:m:typA", "resC", true, deploytest.ResourceOptions{
    86  			AliasURNs: []resource.URN{resURN},
    87  		})
    88  		assert.Error(t, err)
    89  		return nil
    90  	}
    91  
    92  	_, res = TestOp(Update).Run(project, p.GetTarget(t, snap), p.Options, false, p.BackendClient, nil)
    93  	assert.NotNil(t, res)
    94  }