package container

import (
	"LAPP_LF_MOM_BACKEND/web/models"
	"fmt"
	"testing"
)

func TestDefaultSessionManager_New(t *testing.T) {

	informationManager := NewInformationManager()
	defaultSessionManager := NewDefaultSessionManager(informationManager, transactionHandlerFactoryMock)
	if defaultSessionManager == nil {
		t.Fatalf("创建失败!")
	}
	if defaultSessionManager.informationManager == nil {
		t.Fatalf("组件信息管理器不能为空!")
	}
	if defaultSessionManager.transactionHandlerFactory == nil {
		t.Fatalf("事务句柄工厂不能为空!")
	}
	if len(defaultSessionManager.user2SessionMapping) != 0 {
		t.Fatalf("用户会话映射量错误!")
	}
	if len(defaultSessionManager.sessionMapping) != 0 {
		t.Fatalf("会话映射数量错误!")
	}
}

func TestDefaultSessionManager_New_NullInformationManager(t *testing.T) {
	defer func() {
		if err := recover(); err != "组件信息管理器不能为空!" {
			t.Fatalf("意外错误:%s", err)
		}
	}()

	_ = NewDefaultSessionManager(nil, transactionHandlerFactoryMock)
	t.Fatalf("意外的没有错误!")
}

func TestDefaultSessionManager_New_NullTransactionHandlerFactoryMock(t *testing.T) {
	defer func() {
		if err := recover(); err != "事务句柄工厂不能为空!" {
			t.Fatalf("意外错误:%s", err)
		}
	}()

	informationManager := NewInformationManager()
	_ = NewDefaultSessionManager(informationManager, nil)
	t.Fatalf("意外的没有错误!")
}

func TestDefaultSessionManager_GetSession(t *testing.T) {

	informationManager := NewInformationManager()
	sessionManager := NewDefaultSessionManager(informationManager, transactionHandlerFactoryMock)
	sessionId := "sessionId"
	userId := "userId"
	user := &models.Usertab{Userid: userId}
	_, err := sessionManager.GetSession(sessionId, user)
	if err != nil {
		t.Fatalf("意外错误:%s", err.Error())
	}
	session, ok := sessionManager.sessionMapping[sessionId]
	if !ok {
		t.Fatalf("没有找到会话!")
	}
	if session.user.Userid != userId {
		t.Fatalf("会话的用户标识不正确!")
	}
	session, ok = sessionManager.user2SessionMapping[userId]
	if !ok {
		t.Fatalf("没有找到与人员关联的会话!")
	}
	if session.sessionId != sessionId {
		t.Fatalf("会话的会话标识不正确!")
	}
}

func TestDefaultSessionManager_GetSession_Repeated(t *testing.T) {

	informationManager := NewInformationManager()
	sessionManager := NewDefaultSessionManager(informationManager, transactionHandlerFactoryMock)
	sessionId := "sessionId1"
	userId := "userId"
	user := &models.Usertab{Userid: userId}
	_, err := sessionManager.GetSession(sessionId, user)
	if err != nil {
		t.Fatalf("意外错误:%s", err.Error())
	}
	sessionId = "sessionId2"
	_, err = sessionManager.GetSession(sessionId, user)
	if err != nil {
		t.Fatalf("意外错误:%s", err.Error())
	}
	if len(sessionManager.sessionMapping) != 1 {
		t.Fatalf("会话映射射数量错误!")
	}
	if len(sessionManager.user2SessionMapping) != 1 {
		t.Fatalf("用户会话映射数量错误!")
	}
	session, ok := sessionManager.sessionMapping[sessionId]
	if !ok {
		t.Fatalf("没有找到会话!")
	}
	if session.user.Userid != userId {
		t.Fatalf("会话的用户标识不正确!")
	}
	session, ok = sessionManager.user2SessionMapping[userId]
	if !ok {
		t.Fatalf("没有找到与人员关联的会话!")
	}
	if session.sessionId != sessionId {
		t.Fatalf("会话的会话标识不正确!")
	}
}

func TestDefaultSessionManager_GetSession_EmptySessionId(t *testing.T) {

	informationManager := NewInformationManager()
	sessionManager := NewDefaultSessionManager(informationManager, transactionHandlerFactoryMock)
	sessionId := ""
	userId := "userId"
	user := &models.Usertab{Userid: userId}
	_, err := sessionManager.GetSession(sessionId, user)
	if err == nil {
		t.Fatalf("意外的没有错误!")
	}
	if err.Error() != fmt.Sprintf("会话标识不能为空!") {
		t.Fatalf("意外错误:%s", err.Error())
	}
}

func TestDefaultSessionManager_GetSession_NullUser(t *testing.T) {

	informationManager := NewInformationManager()
	sessionManager := NewDefaultSessionManager(informationManager, transactionHandlerFactoryMock)
	sessionId := "sessionId"
	_, err := sessionManager.GetSession(sessionId, nil)
	if err == nil {
		t.Fatalf("意外的没有错误!")
	}
	if err.Error() != fmt.Sprintf("用户信息不能为空!") {
		t.Fatalf("意外错误:%s", err.Error())
	}
}

func TestDefaultSessionManager_GetSession_EmptyUserId(t *testing.T) {

	informationManager := NewInformationManager()
	sessionManager := NewDefaultSessionManager(informationManager, transactionHandlerFactoryMock)
	sessionId := "sessionId"
	userId := ""
	user := &models.Usertab{Userid: userId}
	_, err := sessionManager.GetSession(sessionId, user)
	if err == nil {
		t.Fatalf("意外的没有错误!")
	}
	if err.Error() != fmt.Sprintf("用户标识不能为空!") {
		t.Fatalf("意外错误:%s", err.Error())
	}
}

func TestDefaultSessionManager_ClearSession(t *testing.T) {

	informationManager := NewInformationManager()
	sessionManager := NewDefaultSessionManager(informationManager, transactionHandlerFactoryMock)
	sessionId := "sessionId"
	userId := "userId"
	user := &models.Usertab{Userid: userId}
	_, err := sessionManager.GetSession(sessionId, user)
	if err != nil {
		t.Fatalf("意外错误:%s", err.Error())
	}
	sessionManager.ClearSession(sessionId)
	if len(sessionManager.sessionMapping) != 0 {
		t.Fatalf("会话映射射数量错误!")
	}
	if len(sessionManager.user2SessionMapping) != 0 {
		t.Fatalf("用户会话映射数量错误!")
	}
	_, ok := sessionManager.user2SessionMapping[userId]
	if ok {
		t.Fatalf("清理用户会话映射失败!")
	}
	_, ok = sessionManager.sessionMapping[sessionId]
	if ok {
		t.Fatalf("清理会话映射失败!")
	}
}

func TestDefaultSessionManager_ClearSession_Repeated(t *testing.T) {

	informationManager := NewInformationManager()
	sessionManager := NewDefaultSessionManager(informationManager, transactionHandlerFactoryMock)
	sessionId := "sessionId"
	userId := "userId"
	user := &models.Usertab{Userid: userId}
	_, err := sessionManager.GetSession(sessionId, user)
	if err != nil {
		t.Fatalf("意外错误:%s", err.Error())
	}
	sessionManager.ClearSession(sessionId)
	sessionManager.ClearSession(sessionId)
	if len(sessionManager.sessionMapping) != 0 {
		t.Fatalf("会话映射射数量错误!")
	}
	if len(sessionManager.user2SessionMapping) != 0 {
		t.Fatalf("用户会话映射数量错误!")
	}
	_, ok := sessionManager.user2SessionMapping[userId]
	if ok {
		t.Fatalf("清理用户会话映射失败!")
	}
	_, ok = sessionManager.sessionMapping[sessionId]
	if ok {
		t.Fatalf("清理会话映射失败!")
	}
}
