package htpasswd

import (
	"fmt"
	"reflect"
	"strings"
	"testing"
)

func TestParseHTPasswd(t *testing.T) {
	for _, tc := range []struct {
		desc    string
		input   string
		err     error
		entries map[string][]byte
	}{
		{
			desc: "basic example",
			input: `
# This is a comment in a basic example.
bilbo:{SHA}5siv5c0SHx681xU6GiSx9ZQryqs=
frodo:$2y$05$926C3y10Quzn/LnqQH86VOEVh/18T6RnLaS.khre96jLNL/7e.K5W
MiShil:$2y$05$0oHgwMehvoe8iAWS8I.7l.KoECXrwVaC16RPfaSCU5eVTFrATuMI2
DeokMan:공주님
`,
			entries: map[string][]byte{
				"bilbo":   []byte("{SHA}5siv5c0SHx681xU6GiSx9ZQryqs="),
				"frodo":   []byte("$2y$05$926C3y10Quzn/LnqQH86VOEVh/18T6RnLaS.khre96jLNL/7e.K5W"),
				"MiShil":  []byte("$2y$05$0oHgwMehvoe8iAWS8I.7l.KoECXrwVaC16RPfaSCU5eVTFrATuMI2"),
				"DeokMan": []byte("공주님"),
			},
		},
		{
			desc: "ensures comments are filtered",
			input: `
# asdf:asdf
`,
		},
		{
			desc: "ensure midline hash is not comment",
			input: `
asdf:as#df
`,
			entries: map[string][]byte{
				"asdf": []byte("as#df"),
			},
		},
		{
			desc: "ensure midline hash is not comment",
			input: `
# A valid comment
valid:entry
asdf
`,
			err: fmt.Errorf(`htpasswd: invalid entry at line 4: "asdf"`),
		},
	} {

		entries, err := parseHTPasswd(strings.NewReader(tc.input))
		if err != tc.err {
			if tc.err == nil {
				t.Fatalf("%s: unexpected error: %v", tc.desc, err)
			} else {
				if err.Error() != tc.err.Error() { // use string equality here.
					t.Fatalf("%s: expected error not returned: %v != %v", tc.desc, err, tc.err)
				}
			}
		}

		if tc.err != nil {
			continue // don't test output
		}

		// allow empty and nil to be equal
		if tc.entries == nil {
			tc.entries = map[string][]byte{}
		}

		if !reflect.DeepEqual(entries, tc.entries) {
			t.Fatalf("%s: entries not parsed correctly: %v != %v", tc.desc, entries, tc.entries)
		}
	}
}
