package main

import (
	"encoding/json"
	"testing"

	"github.com/jech/galene/group"
)

func TestMakePassword(t *testing.T) {
	doit := func(pw group.Password) {
		ok, _ := pw.Match("secret")
		if !ok {
			t.Errorf("%v didn't match", pw)
		}
		ok, _ = pw.Match("notsecret")
		if ok {
			t.Errorf("%v did match", pw)
		}
	}
	pw, err := makePassword("secret", "pbkdf2", 4096, 32, 8, 0)
	if err != nil {
		t.Errorf("PBKDF2: %v", err)
	}
	doit(pw)

	pw, err = makePassword("secret", "bcrypt", 0, 0, 0, 10)
	if err != nil {
		t.Errorf("bcrypt: %v", err)
	}
	doit(pw)

	pw, err = makePassword("", "wildcard", 0, 0, 0, 0)
	if err != nil {
		t.Errorf("Wildcard: %v", err)
	}
	ok, _ := pw.Match("notsecretatall")
	if !ok {
		t.Errorf("Wildcard didn't match")
	}
}

func TestFormatPermissions(t *testing.T) {
	tests := []struct{ j, v, p string }{
		{`"op"`, "op", "[cmopt]"},
		{`"present"`, "present", "[mp]"},
		{`"observe"`, "observe", "[]"},
		{`"admin"`, "admin", "[a]"},
		{`["message", "present", "token"]`, "[mpt]", "[mpt]"},
		{`[]`, "[]", "[]"},
	}
	for _, test := range tests {
		var p group.Permissions
		err := json.Unmarshal([]byte(test.j), &p)
		if err != nil {
			t.Errorf("Unmarshal %#v: %v", test.j, err)
			continue
		}
		v := formatPermissions(p)
		if v != test.v {
			t.Errorf("Expected %v, got %v", test.v, v)
		}
		pp := formatRawPermissions(p.Permissions(nil))
		if pp != test.p {
			t.Errorf("Expected %v, got %v", test.p, pp)
		}
	}
}