| 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) |
| } |
| } |
| |
| } |