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 }