mirror of
https://github.com/danielmiessler/Fabric.git
synced 2026-02-11 22:44:59 -05:00
### CHANGES - Introduce `cmd` directory for all main application binaries. - Move all Go packages into the `internal` directory. - Rename the `restapi` package to `server` for clarity. - Consolidate patterns and strategies into a new `data` directory. - Group all auxiliary scripts into a new `scripts` directory. - Move all documentation and images into a `docs` directory. - Update all Go import paths to reflect the new structure. - Adjust CI/CD workflows and build commands for new layout.
139 lines
2.9 KiB
Go
139 lines
2.9 KiB
Go
package template
|
|
|
|
import (
|
|
"fmt"
|
|
"strconv"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestDateTimePlugin(t *testing.T) {
|
|
plugin := &DateTimePlugin{}
|
|
now := time.Now()
|
|
|
|
tests := []struct {
|
|
name string
|
|
operation string
|
|
value string
|
|
validate func(string) error
|
|
wantErr bool
|
|
}{
|
|
{
|
|
name: "now returns RFC3339",
|
|
operation: "now",
|
|
validate: func(got string) error {
|
|
if _, err := time.Parse(time.RFC3339, got); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
},
|
|
},
|
|
{
|
|
name: "time returns HH:MM:SS",
|
|
operation: "time",
|
|
validate: func(got string) error {
|
|
if _, err := time.Parse("15:04:05", got); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
},
|
|
},
|
|
{
|
|
name: "unix returns timestamp",
|
|
operation: "unix",
|
|
validate: func(got string) error {
|
|
if _, err := strconv.ParseInt(got, 10, 64); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
},
|
|
},
|
|
{
|
|
name: "today returns YYYY-MM-DD",
|
|
operation: "today",
|
|
validate: func(got string) error {
|
|
if _, err := time.Parse("2006-01-02", got); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
},
|
|
},
|
|
{
|
|
name: "full returns long date",
|
|
operation: "full",
|
|
validate: func(got string) error {
|
|
if !strings.Contains(got, now.Month().String()) {
|
|
return fmt.Errorf("full date missing month name")
|
|
}
|
|
return nil
|
|
},
|
|
},
|
|
{
|
|
name: "relative positive hours",
|
|
operation: "rel",
|
|
value: "2h",
|
|
validate: func(got string) error {
|
|
t, err := time.Parse(time.RFC3339, got)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
expected := now.Add(2 * time.Hour)
|
|
if t.Hour() != expected.Hour() {
|
|
return fmt.Errorf("expected hour %d, got %d", expected.Hour(), t.Hour())
|
|
}
|
|
return nil
|
|
},
|
|
},
|
|
{
|
|
name: "relative negative days",
|
|
operation: "rel",
|
|
value: "-2d",
|
|
validate: func(got string) error {
|
|
t, err := time.Parse("2006-01-02", got)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
expected := now.AddDate(0, 0, -2)
|
|
if t.Day() != expected.Day() {
|
|
return fmt.Errorf("expected day %d, got %d", expected.Day(), t.Day())
|
|
}
|
|
return nil
|
|
},
|
|
},
|
|
// Error cases
|
|
{
|
|
name: "invalid operation",
|
|
operation: "invalid",
|
|
wantErr: true,
|
|
},
|
|
{
|
|
name: "empty relative value",
|
|
operation: "rel",
|
|
value: "",
|
|
wantErr: true,
|
|
},
|
|
{
|
|
name: "invalid relative format",
|
|
operation: "rel",
|
|
value: "2x",
|
|
wantErr: true,
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
got, err := plugin.Apply(tt.operation, tt.value)
|
|
if (err != nil) != tt.wantErr {
|
|
t.Errorf("DateTimePlugin.Apply() error = %v, wantErr %v", err, tt.wantErr)
|
|
return
|
|
}
|
|
if err == nil && tt.validate != nil {
|
|
if err := tt.validate(got); err != nil {
|
|
t.Errorf("DateTimePlugin.Apply() validation failed: %v", err)
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|