|  | @@ -17,10 +17,16 @@
 | 
	
		
			
				|  |  |  package compose
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import (
 | 
	
		
			
				|  |  | +	"context"
 | 
	
		
			
				|  |  |  	"fmt"
 | 
	
		
			
				|  |  |  	"testing"
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	"github.com/compose-spec/compose-go/types"
 | 
	
		
			
				|  |  | +	"github.com/docker/compose/v2/pkg/api"
 | 
	
		
			
				|  |  | +	"github.com/docker/compose/v2/pkg/mocks"
 | 
	
		
			
				|  |  | +	moby "github.com/docker/docker/api/types"
 | 
	
		
			
				|  |  | +	"github.com/docker/docker/api/types/filters"
 | 
	
		
			
				|  |  | +	"github.com/golang/mock/gomock"
 | 
	
		
			
				|  |  |  	"gotest.tools/assert"
 | 
	
		
			
				|  |  |  )
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -46,3 +52,128 @@ func TestContainerName(t *testing.T) {
 | 
	
		
			
				|  |  |  	_, err = getScale(s)
 | 
	
		
			
				|  |  |  	assert.Error(t, err, fmt.Sprintf(doubledContainerNameWarning, s.Name, s.ContainerName))
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func TestServiceLinks(t *testing.T) {
 | 
	
		
			
				|  |  | +	const dbContainerName = "/" + testProject + "-db-1"
 | 
	
		
			
				|  |  | +	const webContainerName = "/" + testProject + "-web-1"
 | 
	
		
			
				|  |  | +	s := types.ServiceConfig{
 | 
	
		
			
				|  |  | +		Name:  "web",
 | 
	
		
			
				|  |  | +		Scale: 1,
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	containerListOptions := moby.ContainerListOptions{
 | 
	
		
			
				|  |  | +		Filters: filters.NewArgs(
 | 
	
		
			
				|  |  | +			projectFilter(testProject),
 | 
	
		
			
				|  |  | +			serviceFilter("db"),
 | 
	
		
			
				|  |  | +			oneOffFilter(false),
 | 
	
		
			
				|  |  | +		),
 | 
	
		
			
				|  |  | +		All: true,
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	t.Run("service links default", func(t *testing.T) {
 | 
	
		
			
				|  |  | +		mockCtrl := gomock.NewController(t)
 | 
	
		
			
				|  |  | +		defer mockCtrl.Finish()
 | 
	
		
			
				|  |  | +		apiClient := mocks.NewMockAPIClient(mockCtrl)
 | 
	
		
			
				|  |  | +		tested.apiClient = apiClient
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		s.Links = []string{"db"}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		c := testContainer("db", dbContainerName, false)
 | 
	
		
			
				|  |  | +		apiClient.EXPECT().ContainerList(gomock.Any(), containerListOptions).Return([]moby.Container{c}, nil)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		links := tested.getLinks(context.Background(), testProject, s, 1)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		assert.Equal(t, len(links), 3)
 | 
	
		
			
				|  |  | +		assert.Equal(t, links[0], "testProject-db-1:db")
 | 
	
		
			
				|  |  | +		assert.Equal(t, links[1], "testProject-db-1:db-1")
 | 
	
		
			
				|  |  | +		assert.Equal(t, links[2], "testProject-db-1:testProject-db-1")
 | 
	
		
			
				|  |  | +	})
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	t.Run("service links", func(t *testing.T) {
 | 
	
		
			
				|  |  | +		mockCtrl := gomock.NewController(t)
 | 
	
		
			
				|  |  | +		defer mockCtrl.Finish()
 | 
	
		
			
				|  |  | +		apiClient := mocks.NewMockAPIClient(mockCtrl)
 | 
	
		
			
				|  |  | +		tested.apiClient = apiClient
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		s.Links = []string{"db:db"}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		c := testContainer("db", dbContainerName, false)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		apiClient.EXPECT().ContainerList(gomock.Any(), containerListOptions).Return([]moby.Container{c}, nil)
 | 
	
		
			
				|  |  | +		links := tested.getLinks(context.Background(), testProject, s, 1)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		assert.Equal(t, len(links), 3)
 | 
	
		
			
				|  |  | +		assert.Equal(t, links[0], "testProject-db-1:db")
 | 
	
		
			
				|  |  | +		assert.Equal(t, links[1], "testProject-db-1:db-1")
 | 
	
		
			
				|  |  | +		assert.Equal(t, links[2], "testProject-db-1:testProject-db-1")
 | 
	
		
			
				|  |  | +	})
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	t.Run("service links name", func(t *testing.T) {
 | 
	
		
			
				|  |  | +		mockCtrl := gomock.NewController(t)
 | 
	
		
			
				|  |  | +		defer mockCtrl.Finish()
 | 
	
		
			
				|  |  | +		apiClient := mocks.NewMockAPIClient(mockCtrl)
 | 
	
		
			
				|  |  | +		tested.apiClient = apiClient
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		s.Links = []string{"db:dbname"}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		c := testContainer("db", dbContainerName, false)
 | 
	
		
			
				|  |  | +		apiClient.EXPECT().ContainerList(gomock.Any(), containerListOptions).Return([]moby.Container{c}, nil)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		links := tested.getLinks(context.Background(), testProject, s, 1)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		assert.Equal(t, len(links), 3)
 | 
	
		
			
				|  |  | +		assert.Equal(t, links[0], "testProject-db-1:dbname")
 | 
	
		
			
				|  |  | +		assert.Equal(t, links[1], "testProject-db-1:db-1")
 | 
	
		
			
				|  |  | +		assert.Equal(t, links[2], "testProject-db-1:testProject-db-1")
 | 
	
		
			
				|  |  | +	})
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	t.Run("service links external links", func(t *testing.T) {
 | 
	
		
			
				|  |  | +		mockCtrl := gomock.NewController(t)
 | 
	
		
			
				|  |  | +		defer mockCtrl.Finish()
 | 
	
		
			
				|  |  | +		apiClient := mocks.NewMockAPIClient(mockCtrl)
 | 
	
		
			
				|  |  | +		tested.apiClient = apiClient
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		s.Links = []string{"db:dbname"}
 | 
	
		
			
				|  |  | +		s.ExternalLinks = []string{"db1:db2"}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		c := testContainer("db", dbContainerName, false)
 | 
	
		
			
				|  |  | +		apiClient.EXPECT().ContainerList(gomock.Any(), containerListOptions).Return([]moby.Container{c}, nil)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		links := tested.getLinks(context.Background(), testProject, s, 1)
 | 
	
		
			
				|  |  | +		assert.Equal(t, len(links), 4)
 | 
	
		
			
				|  |  | +		assert.Equal(t, links[0], "testProject-db-1:dbname")
 | 
	
		
			
				|  |  | +		assert.Equal(t, links[1], "testProject-db-1:db-1")
 | 
	
		
			
				|  |  | +		assert.Equal(t, links[2], "testProject-db-1:testProject-db-1")
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		// ExternalLink
 | 
	
		
			
				|  |  | +		assert.Equal(t, links[3], "db1:db2")
 | 
	
		
			
				|  |  | +	})
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	t.Run("service links itself oneoff", func(t *testing.T) {
 | 
	
		
			
				|  |  | +		mockCtrl := gomock.NewController(t)
 | 
	
		
			
				|  |  | +		defer mockCtrl.Finish()
 | 
	
		
			
				|  |  | +		apiClient := mocks.NewMockAPIClient(mockCtrl)
 | 
	
		
			
				|  |  | +		tested.apiClient = apiClient
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		s.Links = []string{}
 | 
	
		
			
				|  |  | +		s.ExternalLinks = []string{}
 | 
	
		
			
				|  |  | +		s.Labels = s.Labels.Add(api.OneoffLabel, "True")
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		c := testContainer("web", webContainerName, true)
 | 
	
		
			
				|  |  | +		containerListOptionsOneOff := moby.ContainerListOptions{
 | 
	
		
			
				|  |  | +			Filters: filters.NewArgs(
 | 
	
		
			
				|  |  | +				projectFilter(testProject),
 | 
	
		
			
				|  |  | +				serviceFilter("web"),
 | 
	
		
			
				|  |  | +				oneOffFilter(false),
 | 
	
		
			
				|  |  | +			),
 | 
	
		
			
				|  |  | +			All: true,
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		apiClient.EXPECT().ContainerList(gomock.Any(), containerListOptionsOneOff).Return([]moby.Container{c}, nil)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		links := tested.getLinks(context.Background(), testProject, s, 1)
 | 
	
		
			
				|  |  | +		assert.Equal(t, len(links), 3)
 | 
	
		
			
				|  |  | +		assert.Equal(t, links[0], "testProject-web-1:web")
 | 
	
		
			
				|  |  | +		assert.Equal(t, links[1], "testProject-web-1:web-1")
 | 
	
		
			
				|  |  | +		assert.Equal(t, links[2], "testProject-web-1:testProject-web-1")
 | 
	
		
			
				|  |  | +	})
 | 
	
		
			
				|  |  | +}
 |