package users

import "testing"

func TestParsePasswd(t *testing.T) {
	data := []byte(`root:x:0:0:root:/root:/bin/bash
# a comment

daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
alice:x:1000:1000:Alice Smith:/home/alice:/bin/bash
broken:x:notanumber:5:::
short:x:2:2
`)
	got := parsePasswd(data)
	if len(got) != 3 {
		t.Fatalf("expected 3 valid users, got %d: %+v", len(got), got)
	}

	alice := got[2]
	if alice.Username != "alice" || alice.UID != 1000 || alice.GID != 1000 ||
		alice.Comment != "Alice Smith" || alice.Home != "/home/alice" ||
		alice.Shell != "/bin/bash" || alice.System {
		t.Errorf("alice parsed wrong: %+v", alice)
	}
	if !got[0].System || !got[1].System {
		t.Error("root/daemon should be flagged as system accounts")
	}
}

func TestValidateUsername(t *testing.T) {
	valid := []string{"alice", "_svc", "user-1", "a", "machine$", "abc_def"}
	for _, n := range valid {
		if err := validateUsername(n); err != nil {
			t.Errorf("validateUsername(%q) = %v, want nil", n, err)
		}
	}

	invalid := []string{
		"",       // empty
		"-rf",    // leading dash (flag injection)
		"Alice",  // uppercase
		"1user",  // leading digit
		"a b",    // space
		"foo;rm", // shell metachar
		"root:x", // colon (passwd separator)
		"waytoolongusernamethatexceedsthirtytwochars", // >32
	}
	for _, n := range invalid {
		if err := validateUsername(n); err == nil {
			t.Errorf("validateUsername(%q) = nil, want error", n)
		}
	}
}
