Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions cmd/user.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"fmt"
"os"

"github.com/onelogin/onelogin-go-sdk/v4/pkg/onelogin/models"
"github.com/pepabo/onecli/onelogin"
"github.com/pepabo/onecli/utils"
"github.com/spf13/cobra"
Expand Down Expand Up @@ -109,10 +110,42 @@ var modifyEmailCmd = &cobra.Command{
},
}

var addCmd = &cobra.Command{
Use: "add <first-name> <last-name> <email>",
Short: "Add a new user",
Long: `Add a new user to your OneLogin organization`,
Args: cobra.ExactArgs(3),
RunE: func(cmd *cobra.Command, args []string) error {
firstName := args[0]
lastName := args[1]
email := args[2]

client, err := initClient()
if err != nil {
return fmt.Errorf("error initializing OneLogin client: %v", err)
}

newUser := models.User{
Firstname: firstName,
Lastname: lastName,
Email: email,
}

createdUser, err := client.CreateUser(newUser)
if err != nil {
return fmt.Errorf("error creating user: %v", err)
}

fmt.Printf("Successfully added user: %s %s with email: %s\n", createdUser.Firstname, createdUser.Lastname, createdUser.Email)
return nil
},
}

func init() {
userCmd.AddCommand(listCmd)
userCmd.AddCommand(modifyCmd)
modifyCmd.AddCommand(modifyEmailCmd)
userCmd.AddCommand(addCmd)

listCmd.Flags().StringVarP(&output, "output", "o", "yaml", "Output format (yaml, json)")
listCmd.Flags().StringVar(&queryParams.Email, "email", "", "Filter users by email")
Expand Down
1 change: 1 addition & 0 deletions onelogin/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ const (
type OneloginClient interface {
GetUsers(query models.Queryable) (interface{}, error)
UpdateUser(userID int, user models.User) (interface{}, error)
CreateUser(user models.User) (interface{}, error)
}

// Onelogin represents the Onelogin client
Expand Down
42 changes: 42 additions & 0 deletions onelogin/user.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package onelogin

import (
"fmt"
"strconv"
"time"

"github.com/onelogin/onelogin-go-sdk/v4/pkg/onelogin/models"
"github.com/pepabo/onecli/utils"
Expand Down Expand Up @@ -55,3 +57,43 @@ func (o *Onelogin) GetUsers(query UserQuery) ([]models.User, error) {
func (o *Onelogin) UpdateUser(userID int, user models.User) (interface{}, error) {
return o.client.UpdateUser(userID, user)
}

// SetUserState sets the user state to active and updates the last login time
func (o *Onelogin) SetUserState(userID int) error {
user := models.User{
Status: 1, // 1はアクティブを示す
LastLogin: time.Now(),
}
_, err := o.UpdateUser(userID, user)
if err != nil {
return fmt.Errorf("error setting user state: %v", err)
}
return nil
}

// CreateUser creates a new user in Onelogin
func (o *Onelogin) CreateUser(user models.User) (models.User, error) {
createdUserInterface, err := o.client.CreateUser(user)
if err != nil {
return models.User{}, fmt.Errorf("error creating user: %v", err)
}

createdUserMap, ok := createdUserInterface.(map[string]interface{})
if !ok {
return models.User{}, fmt.Errorf("error asserting created user to map[string]interface{}")
}

createdUser := models.User{
ID: int32(createdUserMap["id"].(float64)),
Email: createdUserMap["email"].(string),
Firstname: createdUserMap["firstname"].(string),
Lastname: createdUserMap["lastname"].(string),
}

// ユーザーのステータスをアクティブに設定し、最終ログイン日時を更新
if err := o.SetUserState(int(createdUser.ID)); err != nil {
return models.User{}, err
}

return createdUser, nil
}
74 changes: 74 additions & 0 deletions onelogin/user_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,11 @@ func (m *MockClient) UpdateUser(userID int, user models.User) (interface{}, erro
return args.Get(0), args.Error(1)
}

func (m *MockClient) CreateUser(user models.User) (interface{}, error) {
args := m.Called(user)
return args.Get(0), args.Error(1)
}

func TestGetUsers(t *testing.T) {
tests := []struct {
name string
Expand Down Expand Up @@ -149,3 +154,72 @@ func TestGetUsers(t *testing.T) {
})
}
}

func TestCreateUser(t *testing.T) {
tests := []struct {
name string
inputUser models.User
mockResponse interface{}
mockError error
expectedUser models.User
expectedError error
}{
{
name: "successful user creation",
inputUser: models.User{
Email: "newuser@example.com",
Username: "newuser",
Firstname: "New",
Lastname: "User",
},
mockResponse: map[string]interface{}{
"id": 3,
"email": "newuser@example.com",
"username": "newuser",
"firstname": "New",
"lastname": "User",
},
expectedUser: models.User{
ID: 3,
Email: "newuser@example.com",
Username: "newuser",
Firstname: "New",
Lastname: "User",
},
},
{
name: "error creating user",
inputUser: models.User{
Email: "erroruser@example.com",
Username: "erroruser",
Firstname: "Error",
Lastname: "User",
},
mockError: assert.AnError,
expectedError: assert.AnError,
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
mockClient := new(MockClient)
o := &Onelogin{
client: mockClient,
}

mockClient.On("CreateUser", tt.inputUser).Return(tt.mockResponse, tt.mockError)

createdUser, err := o.CreateUser(tt.inputUser)

if tt.expectedError != nil {
assert.Error(t, err)
assert.Equal(t, tt.expectedError, err)
} else {
assert.NoError(t, err)
assert.Equal(t, tt.expectedUser, createdUser)
}

mockClient.AssertExpectations(t)
})
}
}