Files
core/cluster/store/identity_test.go
2024-07-09 12:26:02 +02:00

446 lines
8.9 KiB
Go

package store
import (
"testing"
"time"
"github.com/datarhei/core/v16/iam/access"
"github.com/datarhei/core/v16/iam/identity"
"github.com/stretchr/testify/require"
)
func TestAddIdentityCommand(t *testing.T) {
s, err := createStore()
require.NoError(t, err)
identity := identity.User{
Name: "foobar",
}
err = s.applyCommand(Command{
Operation: OpAddIdentity,
Data: CommandAddIdentity{
Identity: identity,
},
})
require.NoError(t, err)
require.Equal(t, 1, len(s.data.Users.Users))
}
func TestAddIdentity(t *testing.T) {
s, err := createStore()
require.NoError(t, err)
idty := identity.User{
Name: "foobar",
}
err = s.addIdentity(CommandAddIdentity{
Identity: idty,
})
require.NoError(t, err)
require.Equal(t, 1, len(s.data.Users.Users))
require.Equal(t, 0, len(s.data.Policies.Policies))
err = s.addIdentity(CommandAddIdentity{
Identity: idty,
})
require.Error(t, err)
require.Equal(t, 1, len(s.data.Users.Users))
require.Equal(t, 0, len(s.data.Policies.Policies))
u := s.IAMIdentityGet("foobar")
require.Equal(t, 1, len(u.Users))
user := u.Users[0]
require.Equal(t, user.CreatedAt, user.UpdatedAt)
require.NotEqual(t, time.Time{}, user.CreatedAt)
}
func TestAddIdentityWithAlias(t *testing.T) {
s, err := createStore()
require.NoError(t, err)
idty := identity.User{
Name: "foobar",
}
err = s.addIdentity(CommandAddIdentity{
Identity: idty,
})
require.NoError(t, err)
idty = identity.User{
Name: "foobaz",
Alias: "foobar",
}
err = s.addIdentity(CommandAddIdentity{
Identity: idty,
})
require.Error(t, err)
idty = identity.User{
Name: "foobaz",
Alias: "foobaz",
}
err = s.addIdentity(CommandAddIdentity{
Identity: idty,
})
require.NoError(t, err)
idty = identity.User{
Name: "barfoo",
Alias: "foobaz",
}
err = s.addIdentity(CommandAddIdentity{
Identity: idty,
})
require.Error(t, err)
}
func TestRemoveIdentityCommand(t *testing.T) {
s, err := createStore()
require.NoError(t, err)
identity := identity.User{
Name: "foobar",
}
err = s.applyCommand(Command{
Operation: OpAddIdentity,
Data: CommandAddIdentity{
Identity: identity,
},
})
require.NoError(t, err)
require.Equal(t, 1, len(s.data.Users.Users))
err = s.applyCommand(Command{
Operation: OpRemoveIdentity,
Data: CommandRemoveIdentity{
Name: "foobar",
},
})
require.NoError(t, err)
require.Equal(t, 0, len(s.data.Users.Users))
}
func TestRemoveIdentity(t *testing.T) {
s, err := createStore()
require.NoError(t, err)
identity := identity.User{
Name: "foobar",
}
err = s.addIdentity(CommandAddIdentity{
Identity: identity,
})
require.NoError(t, err)
require.Equal(t, 1, len(s.data.Users.Users))
require.Equal(t, 0, len(s.data.Policies.Policies))
err = s.removeIdentity(CommandRemoveIdentity{
Name: "foobar",
})
require.NoError(t, err)
require.Equal(t, 0, len(s.data.Users.Users))
require.Equal(t, 0, len(s.data.Policies.Policies))
err = s.removeIdentity(CommandRemoveIdentity{
Name: "foobar",
})
require.NoError(t, err)
require.Equal(t, 0, len(s.data.Users.Users))
require.Equal(t, 0, len(s.data.Policies.Policies))
}
func TestRemoveIdentityWithAlias(t *testing.T) {
s, err := createStore()
require.NoError(t, err)
idty := identity.User{
Name: "foobar",
Alias: "foobaz",
}
err = s.addIdentity(CommandAddIdentity{
Identity: idty,
})
require.NoError(t, err)
require.Equal(t, 1, len(s.data.Users.Users))
err = s.removeIdentity(CommandRemoveIdentity{
Name: "foobaz",
})
require.NoError(t, err)
require.Equal(t, 0, len(s.data.Users.Users))
err = s.removeIdentity(CommandRemoveIdentity{
Name: "foobar",
})
require.NoError(t, err)
require.Equal(t, 0, len(s.data.Users.Users))
}
func TestUpdateUserCommand(t *testing.T) {
s, err := createStore()
require.NoError(t, err)
idty1 := identity.User{
Name: "foobar1",
}
idty2 := identity.User{
Name: "foobar2",
}
err = s.applyCommand(Command{
Operation: OpAddIdentity,
Data: CommandAddIdentity{
Identity: idty1,
},
})
require.NoError(t, err)
require.Equal(t, 1, len(s.data.Users.Users))
err = s.applyCommand(Command{
Operation: OpAddIdentity,
Data: CommandAddIdentity{
Identity: idty2,
},
})
require.NoError(t, err)
require.Equal(t, 2, len(s.data.Users.Users))
err = s.applyCommand(Command{
Operation: OpUpdateIdentity,
Data: CommandUpdateIdentity{
Name: "foobar1",
Identity: identity.User{
Name: "foobar3",
},
},
})
require.NoError(t, err)
require.Equal(t, 2, len(s.data.Users.Users))
}
func TestUpdateIdentity(t *testing.T) {
s, err := createStore()
require.NoError(t, err)
idty1 := identity.User{
Name: "foobar1",
}
idty2 := identity.User{
Name: "foobar2",
}
err = s.addIdentity(CommandAddIdentity{
Identity: idty1,
})
require.NoError(t, err)
require.Equal(t, 1, len(s.data.Users.Users))
err = s.addIdentity(CommandAddIdentity{
Identity: idty2,
})
require.NoError(t, err)
require.Equal(t, 2, len(s.data.Users.Users))
foobar := s.IAMIdentityGet("foobar1").Users[0]
require.True(t, foobar.CreatedAt.Equal(foobar.UpdatedAt))
require.False(t, time.Time{}.Equal(foobar.CreatedAt))
idty := identity.User{
Name: "foobaz",
}
err = s.updateIdentity(CommandUpdateIdentity{
Name: "foobar",
Identity: idty,
})
require.Error(t, err)
require.Equal(t, 2, len(s.data.Users.Users))
idty.Name = "foobar2"
err = s.updateIdentity(CommandUpdateIdentity{
Name: "foobar1",
Identity: idty,
})
require.Error(t, err)
require.Equal(t, 2, len(s.data.Users.Users))
idty.Name = "foobaz"
err = s.updateIdentity(CommandUpdateIdentity{
Name: "foobar1",
Identity: idty,
})
require.NoError(t, err)
require.Equal(t, 2, len(s.data.Users.Users))
u := s.IAMIdentityGet("foobar1")
require.Empty(t, u.Users)
u = s.IAMIdentityGet("foobar2")
require.NotEmpty(t, u.Users)
u = s.IAMIdentityGet("foobaz")
require.NotEmpty(t, u.Users)
require.True(t, u.Users[0].CreatedAt.Equal(foobar.CreatedAt))
require.False(t, u.Users[0].UpdatedAt.Equal(foobar.UpdatedAt))
require.False(t, time.Time{}.Equal(foobar.CreatedAt))
}
func TestUpdateIdentityWithAlias(t *testing.T) {
s, err := createStore()
require.NoError(t, err)
idty1 := identity.User{
Name: "foobar1",
Alias: "fooalias1",
}
idty2 := identity.User{
Name: "foobar2",
Alias: "fooalias2",
}
err = s.addIdentity(CommandAddIdentity{
Identity: idty1,
})
require.NoError(t, err)
require.Equal(t, 1, len(s.data.Users.Users))
err = s.addIdentity(CommandAddIdentity{
Identity: idty2,
})
require.NoError(t, err)
require.Equal(t, 2, len(s.data.Users.Users))
idty := identity.User{
Name: "foobaz",
}
err = s.updateIdentity(CommandUpdateIdentity{
Name: "foobar",
Identity: idty,
})
require.Error(t, err)
require.Equal(t, 2, len(s.data.Users.Users))
idty.Name = "foobar2"
err = s.updateIdentity(CommandUpdateIdentity{
Name: "foobar1",
Identity: idty,
})
require.Error(t, err)
require.Equal(t, 2, len(s.data.Users.Users))
idty.Name = "foobaz"
idty.Alias = "fooalias2"
err = s.updateIdentity(CommandUpdateIdentity{
Name: "foobar1",
Identity: idty,
})
require.Error(t, err)
require.Equal(t, 2, len(s.data.Users.Users))
idty.Name = "foobaz"
idty.Alias = "fooalias"
err = s.updateIdentity(CommandUpdateIdentity{
Name: "fooalias1",
Identity: idty,
})
require.NoError(t, err)
require.Equal(t, 2, len(s.data.Users.Users))
u := s.IAMIdentityGet("foobar1")
require.Empty(t, u.Users)
u = s.IAMIdentityGet("fooalias1")
require.Empty(t, u.Users)
u = s.IAMIdentityGet("foobar2")
require.NotEmpty(t, u.Users)
u = s.IAMIdentityGet("fooalias2")
require.NotEmpty(t, u.Users)
u = s.IAMIdentityGet("foobaz")
require.NotEmpty(t, u.Users)
u = s.IAMIdentityGet("fooalias")
require.NotEmpty(t, u.Users)
}
func TestUpdateIdentityWithPolicies(t *testing.T) {
s, err := createStore()
require.NoError(t, err)
idty1 := identity.User{
Name: "foobar",
}
policies := []access.Policy{
{
Name: "bla",
Domain: "bla",
Resource: "bla",
Actions: []string{},
},
{
Name: "foo",
Domain: "foo",
Resource: "foo",
Actions: []string{},
},
}
err = s.addIdentity(CommandAddIdentity{
Identity: idty1,
})
require.NoError(t, err)
require.Equal(t, 1, len(s.data.Users.Users))
err = s.setPolicies(CommandSetPolicies{
Name: "foobar",
Policies: policies,
})
require.NoError(t, err)
require.Equal(t, 2, len(s.data.Policies.Policies["foobar"]))
err = s.updateIdentity(CommandUpdateIdentity{
Name: "foobar",
Identity: idty1,
})
require.NoError(t, err)
require.Equal(t, 1, len(s.data.Users.Users))
require.Equal(t, 2, len(s.data.Policies.Policies["foobar"]))
idty2 := identity.User{
Name: "foobaz",
}
err = s.updateIdentity(CommandUpdateIdentity{
Name: "foobar",
Identity: idty2,
})
require.NoError(t, err)
require.Equal(t, 1, len(s.data.Users.Users))
require.Equal(t, 0, len(s.data.Policies.Policies["foobar"]))
require.Equal(t, 2, len(s.data.Policies.Policies["foobaz"]))
}