110 lines
3.3 KiB
Go
110 lines
3.3 KiB
Go
package network_test
|
|
|
|
import (
|
|
"context"
|
|
"os"
|
|
"testing"
|
|
|
|
"github.com/flowy-live/llink/internal/network"
|
|
"github.com/flowy-live/llink/internal/testhelper"
|
|
"github.com/jackc/pgx/v5/pgxpool"
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
var dbPool *pgxpool.Pool
|
|
|
|
func TestMain(m *testing.M) {
|
|
dbPool = testhelper.SetupTestDB()
|
|
defer testhelper.TeardownTestDB()
|
|
|
|
ret := m.Run()
|
|
os.Exit(ret)
|
|
}
|
|
|
|
func TestNetworkService(t *testing.T) {
|
|
ctx := context.Background()
|
|
svc := network.NewService(dbPool)
|
|
|
|
// Test Create
|
|
createdNetwork, err := svc.Create(ctx, "Test Network", "admin@example.com")
|
|
assert.NoError(t, err)
|
|
assert.NotEmpty(t, createdNetwork.ID)
|
|
assert.Equal(t, "Test Network", createdNetwork.Name)
|
|
assert.Equal(t, "admin@example.com", createdNetwork.AdminEmail)
|
|
assert.NotZero(t, createdNetwork.CreatedAt)
|
|
|
|
// Test GetByID
|
|
foundNetwork, err := svc.GetByID(ctx, createdNetwork.ID)
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, createdNetwork.ID, foundNetwork.ID)
|
|
assert.Equal(t, createdNetwork.Name, foundNetwork.Name)
|
|
assert.Equal(t, createdNetwork.AdminEmail, foundNetwork.AdminEmail)
|
|
|
|
// Test GetByID with non-existent id
|
|
_, err = svc.GetByID(ctx, "network_nonexistent")
|
|
assert.Error(t, err)
|
|
assert.ErrorIs(t, err, network.ErrNotFound)
|
|
|
|
// Test SetName
|
|
err = svc.SetName(ctx, createdNetwork.ID, "Updated Network Name")
|
|
assert.NoError(t, err)
|
|
|
|
// Verify name was updated
|
|
updatedNetwork, err := svc.GetByID(ctx, createdNetwork.ID)
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, "Updated Network Name", updatedNetwork.Name)
|
|
|
|
// Test SetName with non-existent id
|
|
err = svc.SetName(ctx, "network_nonexistent", "New Name")
|
|
assert.Error(t, err)
|
|
assert.ErrorIs(t, err, network.ErrNotFound)
|
|
|
|
// Test AddMembers
|
|
err = svc.AddMembers(ctx, createdNetwork.ID, []string{"member1@example.com", "member2@example.com"})
|
|
assert.NoError(t, err)
|
|
|
|
// Test ListForEmail - should find network for admin
|
|
networks, err := svc.ListForEmail(ctx, "admin@example.com")
|
|
assert.NoError(t, err)
|
|
assert.Len(t, networks, 1)
|
|
assert.Equal(t, createdNetwork.ID, networks[0].ID)
|
|
|
|
// Test ListForEmail - should find network for member
|
|
networks, err = svc.ListForEmail(ctx, "member1@example.com")
|
|
assert.NoError(t, err)
|
|
assert.Len(t, networks, 1)
|
|
assert.Equal(t, createdNetwork.ID, networks[0].ID)
|
|
|
|
// Test ListForEmail - should return empty for non-member
|
|
networks, err = svc.ListForEmail(ctx, "stranger@example.com")
|
|
assert.NoError(t, err)
|
|
assert.Len(t, networks, 0)
|
|
|
|
// Test RemoveMember
|
|
err = svc.RemoveMember(ctx, createdNetwork.ID, "member1@example.com")
|
|
assert.NoError(t, err)
|
|
|
|
// Verify member was removed
|
|
networks, err = svc.ListForEmail(ctx, "member1@example.com")
|
|
assert.NoError(t, err)
|
|
assert.Len(t, networks, 0)
|
|
|
|
// member2 should still have access
|
|
networks, err = svc.ListForEmail(ctx, "member2@example.com")
|
|
assert.NoError(t, err)
|
|
assert.Len(t, networks, 1)
|
|
|
|
// Create another network and verify ListForEmail returns multiple
|
|
network2, err := svc.Create(ctx, "Second Network", "member2@example.com")
|
|
assert.NoError(t, err)
|
|
|
|
networks, err = svc.ListForEmail(ctx, "member2@example.com")
|
|
assert.NoError(t, err)
|
|
assert.Len(t, networks, 2)
|
|
|
|
// Verify both networks are returned
|
|
networkIDs := []string{networks[0].ID, networks[1].ID}
|
|
assert.Contains(t, networkIDs, createdNetwork.ID)
|
|
assert.Contains(t, networkIDs, network2.ID)
|
|
}
|