main

mattermost/focalboard

Last updated at: 29/12/2023 09:46

user_test.go

TLDR

This file contains a test and a mock implementation for a plugin delivery service. It also includes a mock of the services API used by the plugin delivery service.

Method

Test_userByUsername

This method is a test function that tests the UserByUsername method of the delivery object. It checks if the returned user object and error match the expected values for different input cases.

Classes

servicesAPIMock

This class represents a mock implementation of the services API. It contains methods for retrieving users by username, getting direct channels, creating posts, getting users by ID, getting team members, getting channels by ID, getting channel members, and creating team members.

// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.

package plugindelivery

import (
	"reflect"
	"testing"

	"github.com/mattermost/focalboard/server/model"

	mm_model "github.com/mattermost/mattermost-server/v6/model"
)

var (
	defTeamID = mm_model.NewId()

	user1 = &mm_model.User{
		Id:       mm_model.NewId(),
		Username: "dlauder",
	}
	user2 = &mm_model.User{
		Id:       mm_model.NewId(),
		Username: "steve.mqueen",
	}
	user3 = &mm_model.User{
		Id:       mm_model.NewId(),
		Username: "bart_",
	}
	user4 = &mm_model.User{
		Id:       mm_model.NewId(),
		Username: "missing_",
	}
	user5 = &mm_model.User{
		Id:       mm_model.NewId(),
		Username: "wrong_team",
	}

	mockUsers = map[string]*mm_model.User{
		"dlauder":      user1,
		"steve.mqueen": user2,
		"bart_":        user3,
		"wrong_team":   user5,
	}
)

func Test_userByUsername(t *testing.T) {
	servicesAPI := newServicesAPIMock(mockUsers)
	delivery := New("bot_id", "server_root", servicesAPI)

	tests := []struct {
		name    string
		uname   string
		teamID  string
		want    *mm_model.User
		wantErr bool
	}{
		{name: "user1", uname: user1.Username, want: user1, wantErr: false},
		{name: "user1 with period", uname: user1.Username + ".", want: user1, wantErr: false},
		{name: "user1 with period plus more", uname: user1.Username + ". ", want: user1, wantErr: false},
		{name: "user2 with periods", uname: user2.Username + "...", want: user2, wantErr: false},
		{name: "user2 with underscore", uname: user2.Username + "_", want: user2, wantErr: false},
		{name: "user2 with hyphen plus more", uname: user2.Username + "- ", want: user2, wantErr: false},
		{name: "user2 with hyphen plus all", uname: user2.Username + ".-_ ", want: user2, wantErr: false},
		{name: "user3 with underscore", uname: user3.Username + "_", want: user3, wantErr: false},
		{name: "user4 missing", uname: user4.Username, want: nil, wantErr: true},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			got, err := delivery.UserByUsername(tt.uname)
			if (err != nil) != tt.wantErr {
				t.Errorf("userByUsername() error = %v, wantErr %v", err, tt.wantErr)
				return
			}
			if !reflect.DeepEqual(got, tt.want) {
				t.Errorf("userByUsername()\ngot:\n%v\nwant:\n%v\n", got, tt.want)
			}
		})
	}
}

type servicesAPIMock struct {
	users map[string]*mm_model.User
}

func newServicesAPIMock(users map[string]*mm_model.User) servicesAPIMock {
	return servicesAPIMock{
		users: users,
	}
}

func (m servicesAPIMock) GetUserByUsername(name string) (*mm_model.User, error) {
	user, ok := m.users[name]
	if !ok {
		return nil, model.NewErrNotFound(name)
	}
	return user, nil
}

func (m servicesAPIMock) GetDirectChannel(userID1, userID2 string) (*mm_model.Channel, error) {
	return nil, nil
}

func (m servicesAPIMock) GetDirectChannelOrCreate(userID1, userID2 string) (*mm_model.Channel, error) {
	return nil, nil
}

func (m servicesAPIMock) CreatePost(post *mm_model.Post) (*mm_model.Post, error) {
	return post, nil
}

func (m servicesAPIMock) GetUserByID(userID string) (*mm_model.User, error) {
	for _, user := range m.users {
		if user.Id == userID {
			return user, nil
		}
	}
	return nil, model.NewErrNotFound(userID)
}

func (m servicesAPIMock) GetTeamMember(teamID string, userID string) (*mm_model.TeamMember, error) {
	user, err := m.GetUserByID(userID)
	if err != nil {
		return nil, err
	}

	if teamID != defTeamID {
		return nil, model.NewErrNotFound(teamID)
	}

	member := &mm_model.TeamMember{
		UserId: user.Id,
		TeamId: teamID,
	}
	return member, nil
}

func (m servicesAPIMock) GetChannelByID(channelID string) (*mm_model.Channel, error) {
	return nil, model.NewErrNotFound(channelID)
}

func (m servicesAPIMock) GetChannelMember(channelID string, userID string) (*mm_model.ChannelMember, error) {
	return nil, model.NewErrNotFound(userID)
}

func (m servicesAPIMock) CreateMember(teamID string, userID string) (*mm_model.TeamMember, error) {
	member := &mm_model.TeamMember{
		UserId: userID,
		TeamId: teamID,
	}
	return member, nil
}