|  | @@ -96,6 +96,95 @@ func TestDown(t *testing.T) {
 | 
	
		
			
				|  |  |  	assert.NilError(t, err)
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +func TestDownWithGivenServices(t *testing.T) {
 | 
	
		
			
				|  |  | +	mockCtrl := gomock.NewController(t)
 | 
	
		
			
				|  |  | +	defer mockCtrl.Finish()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	api, cli := prepareMocks(mockCtrl)
 | 
	
		
			
				|  |  | +	tested := composeService{
 | 
	
		
			
				|  |  | +		dockerCli: cli,
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	api.EXPECT().ContainerList(gomock.Any(), projectFilterListOpt(false)).Return(
 | 
	
		
			
				|  |  | +		[]moby.Container{
 | 
	
		
			
				|  |  | +			testContainer("service1", "123", false),
 | 
	
		
			
				|  |  | +			testContainer("service2", "456", false),
 | 
	
		
			
				|  |  | +			testContainer("service2", "789", false),
 | 
	
		
			
				|  |  | +			testContainer("service_orphan", "321", true),
 | 
	
		
			
				|  |  | +		}, nil)
 | 
	
		
			
				|  |  | +	api.EXPECT().VolumeList(
 | 
	
		
			
				|  |  | +		gomock.Any(),
 | 
	
		
			
				|  |  | +		volume.ListOptions{
 | 
	
		
			
				|  |  | +			Filters: filters.NewArgs(projectFilter(strings.ToLower(testProject))),
 | 
	
		
			
				|  |  | +		}).
 | 
	
		
			
				|  |  | +		Return(volume.ListResponse{}, nil)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	// network names are not guaranteed to be unique, ensure Compose handles
 | 
	
		
			
				|  |  | +	// cleanup properly if duplicates are inadvertently created
 | 
	
		
			
				|  |  | +	api.EXPECT().NetworkList(gomock.Any(), network.ListOptions{Filters: filters.NewArgs(projectFilter(strings.ToLower(testProject)))}).
 | 
	
		
			
				|  |  | +		Return([]network.Summary{
 | 
	
		
			
				|  |  | +			{ID: "abc123", Name: "myProject_default", Labels: map[string]string{compose.NetworkLabel: "default"}},
 | 
	
		
			
				|  |  | +			{ID: "def456", Name: "myProject_default", Labels: map[string]string{compose.NetworkLabel: "default"}},
 | 
	
		
			
				|  |  | +		}, nil)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	stopOptions := containerType.StopOptions{}
 | 
	
		
			
				|  |  | +	api.EXPECT().ContainerStop(gomock.Any(), "123", stopOptions).Return(nil)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	api.EXPECT().ContainerRemove(gomock.Any(), "123", containerType.RemoveOptions{Force: true}).Return(nil)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	api.EXPECT().NetworkList(gomock.Any(), network.ListOptions{
 | 
	
		
			
				|  |  | +		Filters: filters.NewArgs(
 | 
	
		
			
				|  |  | +			projectFilter(strings.ToLower(testProject)),
 | 
	
		
			
				|  |  | +			networkFilter("default")),
 | 
	
		
			
				|  |  | +	}).Return([]network.Summary{
 | 
	
		
			
				|  |  | +		{ID: "abc123", Name: "myProject_default"},
 | 
	
		
			
				|  |  | +	}, nil)
 | 
	
		
			
				|  |  | +	api.EXPECT().NetworkInspect(gomock.Any(), "abc123", gomock.Any()).Return(network.Inspect{ID: "abc123"}, nil)
 | 
	
		
			
				|  |  | +	api.EXPECT().NetworkRemove(gomock.Any(), "abc123").Return(nil)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	err := tested.Down(context.Background(), strings.ToLower(testProject), compose.DownOptions{
 | 
	
		
			
				|  |  | +		Services: []string{"service1", "not-running-service"},
 | 
	
		
			
				|  |  | +	})
 | 
	
		
			
				|  |  | +	assert.NilError(t, err)
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func TestDownWithSpecifiedServiceButTheServicesAreNotRunning(t *testing.T) {
 | 
	
		
			
				|  |  | +	mockCtrl := gomock.NewController(t)
 | 
	
		
			
				|  |  | +	defer mockCtrl.Finish()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	api, cli := prepareMocks(mockCtrl)
 | 
	
		
			
				|  |  | +	tested := composeService{
 | 
	
		
			
				|  |  | +		dockerCli: cli,
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	api.EXPECT().ContainerList(gomock.Any(), projectFilterListOpt(false)).Return(
 | 
	
		
			
				|  |  | +		[]moby.Container{
 | 
	
		
			
				|  |  | +			testContainer("service1", "123", false),
 | 
	
		
			
				|  |  | +			testContainer("service2", "456", false),
 | 
	
		
			
				|  |  | +			testContainer("service2", "789", false),
 | 
	
		
			
				|  |  | +			testContainer("service_orphan", "321", true),
 | 
	
		
			
				|  |  | +		}, nil)
 | 
	
		
			
				|  |  | +	api.EXPECT().VolumeList(
 | 
	
		
			
				|  |  | +		gomock.Any(),
 | 
	
		
			
				|  |  | +		volume.ListOptions{
 | 
	
		
			
				|  |  | +			Filters: filters.NewArgs(projectFilter(strings.ToLower(testProject))),
 | 
	
		
			
				|  |  | +		}).
 | 
	
		
			
				|  |  | +		Return(volume.ListResponse{}, nil)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	// network names are not guaranteed to be unique, ensure Compose handles
 | 
	
		
			
				|  |  | +	// cleanup properly if duplicates are inadvertently created
 | 
	
		
			
				|  |  | +	api.EXPECT().NetworkList(gomock.Any(), network.ListOptions{Filters: filters.NewArgs(projectFilter(strings.ToLower(testProject)))}).
 | 
	
		
			
				|  |  | +		Return([]network.Summary{
 | 
	
		
			
				|  |  | +			{ID: "abc123", Name: "myProject_default", Labels: map[string]string{compose.NetworkLabel: "default"}},
 | 
	
		
			
				|  |  | +			{ID: "def456", Name: "myProject_default", Labels: map[string]string{compose.NetworkLabel: "default"}},
 | 
	
		
			
				|  |  | +		}, nil)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	err := tested.Down(context.Background(), strings.ToLower(testProject), compose.DownOptions{
 | 
	
		
			
				|  |  | +		Services: []string{"not-running-service1", "not-running-service2"},
 | 
	
		
			
				|  |  | +	})
 | 
	
		
			
				|  |  | +	assert.NilError(t, err)
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  func TestDownRemoveOrphans(t *testing.T) {
 | 
	
		
			
				|  |  |  	mockCtrl := gomock.NewController(t)
 | 
	
		
			
				|  |  |  	defer mockCtrl.Finish()
 |