github.com/maguro-alternative/remake_bot@v0.0.0-20240519004221-59c73aaf0518/web/handler/views/guildid/guildid_test.go (about)

     1  package guildid
     2  
     3  import (
     4  	"net/http"
     5  	"net/http/httptest"
     6  	"os"
     7  	"testing"
     8  
     9  	"github.com/maguro-alternative/remake_bot/web/service"
    10  	"github.com/maguro-alternative/remake_bot/web/shared/ctxvalue"
    11  	"github.com/maguro-alternative/remake_bot/web/shared/model"
    12  
    13  	"github.com/bwmarrin/discordgo"
    14  	"github.com/stretchr/testify/assert"
    15  	"github.com/stretchr/testify/require"
    16  )
    17  
    18  func TestNewLinePostDiscordChannelViewHandler(t *testing.T) {
    19  	cwd, err := os.Getwd()
    20  	require.NoError(t, err)
    21  	t.Cleanup(func() {
    22  		require.NoError(t, os.Chdir(cwd))
    23  	})
    24  	require.NoError(t, os.Chdir("../../../../"))
    25  	t.Run("設定ページ一覧が正常に表示される(管理者)", func(t *testing.T) {
    26  		indexService := &service.IndexService{
    27  			DiscordSession: &discordgo.Session{},
    28  		}
    29  		indexService.DiscordBotState = discordgo.NewState()
    30  		err := indexService.DiscordBotState.GuildAdd(&discordgo.Guild{
    31  			ID: "123",
    32  			Channels: []*discordgo.Channel{
    33  				{
    34  					ID:       "123",
    35  					Name:     "test",
    36  					Position: 1,
    37  					Type:     discordgo.ChannelTypeGuildText,
    38  				},
    39  				{
    40  					ID:       "1234",
    41  					Name:     "test",
    42  					Position: 2,
    43  					Type:     discordgo.ChannelTypeGuildText,
    44  				},
    45  				{
    46  					ID:       "12345",
    47  					Name:     "test",
    48  					Position: 3,
    49  					Type:     discordgo.ChannelTypeGuildText,
    50  				},
    51  			},
    52  			Members: []*discordgo.Member{
    53  				{
    54  					User: &discordgo.User{
    55  						ID: "123",
    56  					},
    57  				},
    58  			},
    59  		})
    60  		assert.NoError(t, err)
    61  		assert.Len(t, indexService.DiscordBotState.Guilds, 1)
    62  
    63  		mux := http.NewServeMux()
    64  
    65  		handler := NewGuildIDViewHandler(indexService)
    66  
    67  		mux.HandleFunc("/guild/{guildId}", handler.Index)
    68  
    69  		req := httptest.NewRequest(http.MethodGet, "/guild/123", nil)
    70  		rec := httptest.NewRecorder()
    71  
    72  		mux.ServeHTTP(rec, setAdminCtxValue(req))
    73  
    74  		assert.Equal(t, http.StatusOK, rec.Code)
    75  
    76  		assert.Contains(t, rec.Body.String(), `<p>Discordアカウント: test</p>`)
    77  		assert.Contains(t, rec.Body.String(), `<img src="https://cdn.discordapp.com/avatars/123/test.webp?size=64" alt="Discordアイコン">`)
    78  		assert.Contains(t, rec.Body.String(), `<p>LINEアカウント: 未ログイン</p>`)
    79  
    80  		assert.Contains(t, rec.Body.String(), `<a href="/guild/123/permission" class="btn btn-primary">管理者設定</a>`)
    81  
    82  		assert.Contains(t, rec.Body.String(), `<a href="/guild/123/line-post-discord-channel" class="btn btn-primary">LINEへの送信設定</a>`)
    83  		assert.Contains(t, rec.Body.String(), `<a href="/guild/123/linetoken" class="btn btn-primary">LINEBOTおよびグループ設定</a>`)
    84  		assert.Contains(t, rec.Body.String(), `<a href="/guild/123/vc-signal" class="btn btn-primary">ボイスチャンネルの通知設定</a>`)
    85  		assert.Contains(t, rec.Body.String(), `<a href="/guild/123/webhook" class="btn btn-primary">webhookの送信設定</a>`)
    86  	})
    87  
    88  	t.Run("設定ページ一覧が正常に表示される(管理者じゃない)", func(t *testing.T) {
    89  		indexService := &service.IndexService{
    90  			DiscordSession: &discordgo.Session{},
    91  		}
    92  		indexService.DiscordBotState = discordgo.NewState()
    93  		err := indexService.DiscordBotState.GuildAdd(&discordgo.Guild{
    94  			ID: "123",
    95  			Channels: []*discordgo.Channel{
    96  				{
    97  					ID:       "123",
    98  					Name:     "test",
    99  					Position: 1,
   100  					Type:     discordgo.ChannelTypeGuildText,
   101  				},
   102  				{
   103  					ID:       "1234",
   104  					Name:     "test",
   105  					Position: 2,
   106  					Type:     discordgo.ChannelTypeGuildText,
   107  				},
   108  				{
   109  					ID:       "12345",
   110  					Name:     "test",
   111  					Position: 3,
   112  					Type:     discordgo.ChannelTypeGuildText,
   113  				},
   114  			},
   115  			Members: []*discordgo.Member{
   116  				{
   117  					User: &discordgo.User{
   118  						ID: "123",
   119  					},
   120  				},
   121  			},
   122  		})
   123  		assert.NoError(t, err)
   124  		assert.Len(t, indexService.DiscordBotState.Guilds, 1)
   125  
   126  		mux := http.NewServeMux()
   127  
   128  		handler := NewGuildIDViewHandler(indexService)
   129  
   130  		mux.HandleFunc("/guild/{guildId}", handler.Index)
   131  
   132  		req := httptest.NewRequest(http.MethodGet, "/guild/123", nil)
   133  		rec := httptest.NewRecorder()
   134  
   135  		mux.ServeHTTP(rec, setNotAdminCtxValue(req))
   136  
   137  		assert.Equal(t, http.StatusOK, rec.Code)
   138  
   139  		assert.Contains(t, rec.Body.String(), `<p>Discordアカウント: test</p>`)
   140  		assert.Contains(t, rec.Body.String(), `<img src="https://cdn.discordapp.com/avatars/123/test.webp?size=64" alt="Discordアイコン">`)
   141  		assert.Contains(t, rec.Body.String(), `<p>LINEアカウント: 未ログイン</p>`)
   142  
   143  		assert.NotContains(t, rec.Body.String(), `<a href="/guild/123/permission" class="btn btn-primary">管理者設定</a>`)
   144  
   145  		assert.Contains(t, rec.Body.String(), `<a href="/guild/123/line-post-discord-channel" class="btn btn-primary">LINEへの送信設定</a>`)
   146  		assert.Contains(t, rec.Body.String(), `<a href="/guild/123/linetoken" class="btn btn-primary">LINEBOTおよびグループ設定</a>`)
   147  		assert.Contains(t, rec.Body.String(), `<a href="/guild/123/vc-signal" class="btn btn-primary">ボイスチャンネルの通知設定</a>`)
   148  		assert.Contains(t, rec.Body.String(), `<a href="/guild/123/webhook" class="btn btn-primary">webhookの送信設定</a>`)
   149  
   150  	})
   151  
   152  }
   153  
   154  func setAdminCtxValue(r *http.Request) *http.Request {
   155  	ctx := r.Context()
   156  	ctx = ctxvalue.ContextWithDiscordPermission(ctx, &model.DiscordPermissionData{
   157  		PermissionCode: 8,
   158  		User: model.DiscordUser{
   159  			ID:       "123",
   160  			Username: "test",
   161  			Avatar:   "test",
   162  		},
   163  		Permission: "all",
   164  	})
   165  	return r.WithContext(ctx)
   166  }
   167  
   168  func setNotAdminCtxValue(r *http.Request) *http.Request {
   169  	ctx := r.Context()
   170  	ctx = ctxvalue.ContextWithDiscordPermission(ctx, &model.DiscordPermissionData{
   171  		PermissionCode: 0,
   172  		User: model.DiscordUser{
   173  			ID:       "123",
   174  			Username: "test",
   175  			Avatar:   "test",
   176  		},
   177  		Permission: "",
   178  	})
   179  	return r.WithContext(ctx)
   180  }