// Copyright 2016 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package conventions

import (
	"reflect"
	"testing"
)

func TestParseBlessingNames(t *testing.T) {
	input := []string{
		"dev.v.io:u:bugs@bunny.com",
		"dev.v.io:u:bugs@bunny.com:frenemy:daffy",
		"dev.v.io:o:836175491023-bhj172jalr081pnjdfpsldjkfh18.apps.googleusercontent.com:mickey@mouse.com",
		"dev.v.io:o:836175491023-bhj172jalr081pnjdfpsldjkfh18.apps.googleusercontent.com:mickey@mouse.com:debugger:friend",
	}
	want := []Blessing{
		Blessing{
			IdentityProvider: "dev.v.io",
			User:             "bugs@bunny.com",
		},
		Blessing{
			IdentityProvider: "dev.v.io",
			User:             "bugs@bunny.com",
			Rest:             "frenemy:daffy",
		},
		Blessing{
			IdentityProvider: "dev.v.io",
			User:             "mickey@mouse.com",
			Application:      "836175491023-bhj172jalr081pnjdfpsldjkfh18.apps.googleusercontent.com",
		},
		Blessing{
			IdentityProvider: "dev.v.io",
			User:             "mickey@mouse.com",
			Application:      "836175491023-bhj172jalr081pnjdfpsldjkfh18.apps.googleusercontent.com",
			Rest:             "debugger:friend",
		},
	}
	got := ParseBlessingNames(input...)
	if !reflect.DeepEqual(got, want) {
		t.Errorf("Got %#v, want %#v", got, want)
	}
}

func TestUserPattern(t *testing.T) {
	for _, test := range []struct{ Input, Want string }{
		{
			"dev.v.io:u:bruce@wayne.com",
			"dev.v.io:u:bruce@wayne.com",
		},
		{
			"dev.v.io:u:bruce@wayne.com:butler:alfred",
			"dev.v.io:u:bruce@wayne.com",
		},
		{ // App-blessing
			"dev.v.io:o:836175491023-bhj172jalr081pnjdfpsldjkfh18.apps.googleusercontent.com:mickey@mouse.com:debugger:friend",
			"dev.v.io:u:mickey@mouse.com",
		},
	} {
		b := ParseBlessingNames(test.Input)
		if len(b) != 1 {
			t.Errorf("%q: expected a single value, got %d (%v)", test.Input, len(b), b)
			continue
		}
		if got := string(b[0].UserPattern()); got != test.Want {
			t.Errorf("%q: Got %q, want %q", test.Input, got, test.Want)
		}
	}
}

func TestHome(t *testing.T) {
	for _, test := range []struct{ Input, Want string }{
		{
			"dev.v.io:u:bruce@wayne.com",
			"home/dev.v.io:u:bruce@wayne.com",
		},
		{
			"dev.v.io:u:bruce/batman@wayne.com",
			"home/dev.v.io:u:bruce%2Fbatman@wayne.com",
		},
		{
			"dev.v.io:u:bruce@wayne.com:butler:alfred",
			"home/dev.v.io:u:bruce@wayne.com",
		},
		{
			"dev.v.io:o:836175491023-bhj172jalr081pnjdfpsldjkfh18.apps.googleusercontent.com:mickey@mouse.com",
			"home/dev.v.io:o:836175491023-bhj172jalr081pnjdfpsldjkfh18.apps.googleusercontent.com:mickey@mouse.com",
		},
		{
			"dev.v.io:o:836175491023-bhj172jalr081pnjdfpsldjkfh18.apps.googleusercontent.com:mickey@mouse.com:debugger:friend",
			"home/dev.v.io:o:836175491023-bhj172jalr081pnjdfpsldjkfh18.apps.googleusercontent.com:mickey@mouse.com",
		},
	} {
		b := ParseBlessingNames(test.Input)
		if len(b) != 1 {
			t.Errorf("%q: expected a single value, got %d (%v)", test.Input, len(b), b)
			continue
		}
		if got := string(b[0].Home()); got != test.Want {
			t.Errorf("%q: Got %q, want %q", test.Input, got, test.Want)
		}
	}
}

func TestAppPattern(t *testing.T) {
	for _, test := range []struct{ Input, Want string }{
		{ // User-centric blessing, cannot restrict to an app
			"dev.v.io:u:bruce@wayne.com",
			"$",
		},
		{
			"dev.v.io:o:836175491023-bhj172jalr081pnjdfpsldjkfh18.apps.googleusercontent.com:mickey@mouse.com:debugger:friend",
			"dev.v.io:o:836175491023-bhj172jalr081pnjdfpsldjkfh18.apps.googleusercontent.com",
		},
	} {
		b := ParseBlessingNames(test.Input)
		if len(b) != 1 {
			t.Errorf("%q: expected a single value, got %d (%v)", test.Input, len(b), b)
			continue
		}
		if got := string(b[0].AppPattern()); got != test.Want {
			t.Errorf("%q: Got %q, want %q", test.Input, got, test.Want)
		}
	}
}

func TestAppUserPattern(t *testing.T) {
	for _, test := range []struct{ Input, Want string }{
		{ // User-centric blessing, cannot restrict to an app
			"dev.v.io:u:bruce@wayne.com",
			"$",
		},
		{
			"dev.v.io:o:836175491023-bhj172jalr081pnjdfpsldjkfh18.apps.googleusercontent.com:mickey@mouse.com:debugger:friend",
			"dev.v.io:o:836175491023-bhj172jalr081pnjdfpsldjkfh18.apps.googleusercontent.com:mickey@mouse.com",
		},
	} {
		b := ParseBlessingNames(test.Input)
		if len(b) != 1 {
			t.Errorf("%q: expected a single value, got %d (%v)", test.Input, len(b), b)
			continue
		}
		if got := string(b[0].AppUserPattern()); got != test.Want {
			t.Errorf("%q: Got %q, want %q", test.Input, got, test.Want)
		}
	}
}

func TestUnconventionalParseBlessingName(t *testing.T) {
	for _, test := range []string{
		"foo",
		"foo:unrecognized:user",
		"dev.v.io:u",
		"dev.v.io:o",
		"dev.v.io:o:app",
		// App-blessing without any extension for the user. Arguably, this should be okay?
		"dev.v.io:o:836175491023-bhj172jalr081pnjdfpsldjkfh18.apps.googleusercontent.com",
	} {
		if b := ParseBlessingNames(test); len(b) != 0 {
			t.Errorf("ParseBlessingNames succeeded for unconventional %q: %v", test, b)
		}
	}
}
