mirror of https://github.com/portainer/portainer
				
				
				
			
		
			
				
	
	
		
			66 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
			
		
		
	
	
			66 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
package teams
 | 
						|
 | 
						|
import (
 | 
						|
	"bytes"
 | 
						|
	"encoding/json"
 | 
						|
	"net/http"
 | 
						|
	"net/http/httptest"
 | 
						|
	"testing"
 | 
						|
 | 
						|
	"github.com/portainer/portainer/api/datastore"
 | 
						|
 | 
						|
	"github.com/stretchr/testify/require"
 | 
						|
	"golang.org/x/sync/errgroup"
 | 
						|
)
 | 
						|
 | 
						|
func TestConcurrentTeamCreation(t *testing.T) {
 | 
						|
	_, store := datastore.MustNewTestStore(t, true, false)
 | 
						|
 | 
						|
	h := &Handler{
 | 
						|
		DataStore: store,
 | 
						|
	}
 | 
						|
 | 
						|
	tcp := teamCreatePayload{
 | 
						|
		Name: "portainer",
 | 
						|
	}
 | 
						|
 | 
						|
	m, err := json.Marshal(tcp)
 | 
						|
	require.NoError(t, err)
 | 
						|
 | 
						|
	errGroup := &errgroup.Group{}
 | 
						|
 | 
						|
	n := 100
 | 
						|
 | 
						|
	for range n {
 | 
						|
		errGroup.Go(func() error {
 | 
						|
			req, err := http.NewRequest(http.MethodPost, "/teams", bytes.NewReader(m))
 | 
						|
			if err != nil {
 | 
						|
				return err
 | 
						|
			}
 | 
						|
 | 
						|
			if err := h.teamCreate(httptest.NewRecorder(), req); err != nil {
 | 
						|
				return err
 | 
						|
			}
 | 
						|
 | 
						|
			return nil
 | 
						|
		})
 | 
						|
	}
 | 
						|
 | 
						|
	err = errGroup.Wait()
 | 
						|
	require.Error(t, err)
 | 
						|
 | 
						|
	teams, err := store.Team().ReadAll()
 | 
						|
	require.NotEmpty(t, teams)
 | 
						|
	require.NoError(t, err)
 | 
						|
 | 
						|
	teamCreated := false
 | 
						|
	for _, team := range teams {
 | 
						|
		if team.Name == tcp.Name {
 | 
						|
			require.False(t, teamCreated)
 | 
						|
			teamCreated = true
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	require.True(t, teamCreated)
 | 
						|
}
 |