// Copyright 2024 Matthew Rich <matthewrich.conf@gmail.com>. All rights reserved.
package resource

import (
	"context"
	_ "encoding/json"
	"fmt"
	"github.com/stretchr/testify/assert"
	_ "io"
	_ "net/http"
	_ "net/http/httptest"
	_ "net/url"
	_ "os"
	_ "strings"
	"testing"
)

func TestNewUserResource(t *testing.T) {
	u := NewUser()
	assert.NotEqual(t, nil, u)
}

func TestReadUser(t *testing.T) {
	ctx := context.Background()
  decl := `
name: "nobody"
`

	u := NewUser()
	e := u.LoadDecl(decl)
	assert.Nil(t, e)
	assert.Equal(t, "nobody", u.Name)

	fmt.Printf("%#v\n", u)
	_, readErr := u.Read(ctx)
	assert.Nil(t, readErr)

	fmt.Printf("%#v\n", u)
	assert.Equal(t, "65534", u.UID)

}

func TestCreateUser(t *testing.T) {

	decl := `
  name: "testuser"
  uid: 12001
  gid: 12001
  home: "/home/testuser"
  state: present
`

	u := NewUser()
	e := u.LoadDecl(decl)
	assert.Equal(t, nil, e)
	assert.Equal(t, "testuser", u.Name)

	u.CreateCommand.Executor = func(value any) ([]byte, error) {
		return []byte(``), nil
	}

	u.ReadCommand.Extractor = func(out []byte, target any) error {
		return nil
	}

	u.DeleteCommand.Executor = func(value any) ([]byte, error) {
		return nil, nil
	}

	applyErr := u.Apply()
	assert.Nil(t, applyErr)

	assert.Equal(t, "12001", u.UID)

	u.State = "absent"

	applyDeleteErr := u.Apply()
	assert.Equal(t, nil, applyDeleteErr)
}
