forked from lug/matterbridge
		
	
		
			
				
	
	
		
			389 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			389 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package gateway
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"strconv"
 | |
| 
 | |
| 	"github.com/42wim/matterbridge/bridge/config"
 | |
| 	"github.com/stretchr/testify/assert"
 | |
| 
 | |
| 	"testing"
 | |
| )
 | |
| 
 | |
| var testconfig = []byte(`
 | |
| [irc.freenode]
 | |
| [mattermost.test]
 | |
| [gitter.42wim]
 | |
| [discord.test]
 | |
| [slack.test]
 | |
| 
 | |
| [[gateway]]
 | |
|     name = "bridge1"
 | |
|     enable=true
 | |
|     
 | |
|     [[gateway.inout]]
 | |
|     account = "irc.freenode"
 | |
|     channel = "#wimtesting"
 | |
|     
 | |
|     [[gateway.inout]]
 | |
|     account="gitter.42wim"
 | |
|     channel="42wim/testroom"
 | |
|     #channel="matterbridge/Lobby"
 | |
| 
 | |
|     [[gateway.inout]]
 | |
|     account = "discord.test"
 | |
|     channel = "general"
 | |
|     
 | |
|     [[gateway.inout]]
 | |
|     account="slack.test"
 | |
|     channel="testing"
 | |
| 	`)
 | |
| 
 | |
| var testconfig2 = []byte(`
 | |
| [irc.freenode]
 | |
| [mattermost.test]
 | |
| [gitter.42wim]
 | |
| [discord.test]
 | |
| [slack.test]
 | |
| 
 | |
| [[gateway]]
 | |
|     name = "bridge1"
 | |
|     enable=true
 | |
|     
 | |
|     [[gateway.in]]
 | |
|     account = "irc.freenode"
 | |
|     channel = "#wimtesting"
 | |
|     
 | |
|     [[gateway.in]]
 | |
|     account="gitter.42wim"
 | |
|     channel="42wim/testroom"
 | |
| 
 | |
|     [[gateway.inout]]
 | |
|     account = "discord.test"
 | |
|     channel = "general"
 | |
|     
 | |
|     [[gateway.out]]
 | |
|     account="slack.test"
 | |
|     channel="testing"
 | |
| [[gateway]]
 | |
|     name = "bridge2"
 | |
|     enable=true
 | |
|     
 | |
|     [[gateway.in]]
 | |
|     account = "irc.freenode"
 | |
|     channel = "#wimtesting2"
 | |
|     
 | |
|     [[gateway.out]]
 | |
|     account="gitter.42wim"
 | |
|     channel="42wim/testroom"
 | |
| 
 | |
|     [[gateway.out]]
 | |
|     account = "discord.test"
 | |
|     channel = "general2"
 | |
| 	`)
 | |
| 
 | |
| var testconfig3 = []byte(`
 | |
| [irc.zzz]
 | |
| [telegram.zzz]
 | |
| [slack.zzz]
 | |
| [[gateway]]
 | |
| name="bridge"
 | |
| enable=true
 | |
| 
 | |
|     [[gateway.inout]]
 | |
|     account="irc.zzz"
 | |
|     channel="#main"		
 | |
| 
 | |
|     [[gateway.inout]]
 | |
|     account="telegram.zzz"
 | |
|     channel="-1111111111111"
 | |
| 
 | |
|     [[gateway.inout]]
 | |
|     account="slack.zzz"
 | |
|     channel="irc"	
 | |
| 	
 | |
| [[gateway]]
 | |
| name="announcements"
 | |
| enable=true
 | |
| 	
 | |
|     [[gateway.in]]
 | |
|     account="telegram.zzz"
 | |
|     channel="-2222222222222"	
 | |
| 	
 | |
|     [[gateway.out]]
 | |
|     account="irc.zzz"
 | |
|     channel="#main"		
 | |
| 	
 | |
|     [[gateway.out]]
 | |
|     account="irc.zzz"
 | |
|     channel="#main-help"	
 | |
| 
 | |
|     [[gateway.out]]
 | |
|     account="telegram.zzz"
 | |
|     channel="--333333333333"	
 | |
| 
 | |
|     [[gateway.out]]
 | |
|     account="slack.zzz"
 | |
|     channel="general"		
 | |
| 	
 | |
| [[gateway]]
 | |
| name="bridge2"
 | |
| enable=true
 | |
| 
 | |
|     [[gateway.inout]]
 | |
|     account="irc.zzz"
 | |
|     channel="#main-help"	
 | |
| 
 | |
|     [[gateway.inout]]
 | |
|     account="telegram.zzz"
 | |
|     channel="--444444444444"	
 | |
| 
 | |
| 	
 | |
| [[gateway]]
 | |
| name="bridge3"
 | |
| enable=true
 | |
| 
 | |
|     [[gateway.inout]]
 | |
|     account="irc.zzz"
 | |
|     channel="#main-telegram"	
 | |
| 
 | |
|     [[gateway.inout]]
 | |
|     account="telegram.zzz"
 | |
|     channel="--333333333333"
 | |
| `)
 | |
| 
 | |
| const (
 | |
| 	ircTestAccount   = "irc.zzz"
 | |
| 	tgTestAccount    = "telegram.zzz"
 | |
| 	slackTestAccount = "slack.zzz"
 | |
| )
 | |
| 
 | |
| func maketestRouter(input []byte) *Router {
 | |
| 	cfg := config.NewConfigFromString(input)
 | |
| 	r, err := NewRouter(cfg)
 | |
| 	if err != nil {
 | |
| 		fmt.Println(err)
 | |
| 	}
 | |
| 	return r
 | |
| }
 | |
| func TestNewRouter(t *testing.T) {
 | |
| 	r := maketestRouter(testconfig)
 | |
| 	assert.Equal(t, 1, len(r.Gateways))
 | |
| 	assert.Equal(t, 4, len(r.Gateways["bridge1"].Bridges))
 | |
| 	assert.Equal(t, 4, len(r.Gateways["bridge1"].Channels))
 | |
| 
 | |
| 	r = maketestRouter(testconfig2)
 | |
| 	assert.Equal(t, 2, len(r.Gateways))
 | |
| 	assert.Equal(t, 4, len(r.Gateways["bridge1"].Bridges))
 | |
| 	assert.Equal(t, 3, len(r.Gateways["bridge2"].Bridges))
 | |
| 	assert.Equal(t, 4, len(r.Gateways["bridge1"].Channels))
 | |
| 	assert.Equal(t, 3, len(r.Gateways["bridge2"].Channels))
 | |
| 	assert.Equal(t, &config.ChannelInfo{
 | |
| 		Name:        "42wim/testroom",
 | |
| 		Direction:   "out",
 | |
| 		ID:          "42wim/testroomgitter.42wim",
 | |
| 		Account:     "gitter.42wim",
 | |
| 		SameChannel: map[string]bool{"bridge2": false},
 | |
| 	}, r.Gateways["bridge2"].Channels["42wim/testroomgitter.42wim"])
 | |
| 	assert.Equal(t, &config.ChannelInfo{
 | |
| 		Name:        "42wim/testroom",
 | |
| 		Direction:   "in",
 | |
| 		ID:          "42wim/testroomgitter.42wim",
 | |
| 		Account:     "gitter.42wim",
 | |
| 		SameChannel: map[string]bool{"bridge1": false},
 | |
| 	}, r.Gateways["bridge1"].Channels["42wim/testroomgitter.42wim"])
 | |
| 	assert.Equal(t, &config.ChannelInfo{
 | |
| 		Name:        "general",
 | |
| 		Direction:   "inout",
 | |
| 		ID:          "generaldiscord.test",
 | |
| 		Account:     "discord.test",
 | |
| 		SameChannel: map[string]bool{"bridge1": false},
 | |
| 	}, r.Gateways["bridge1"].Channels["generaldiscord.test"])
 | |
| }
 | |
| 
 | |
| func TestGetDestChannel(t *testing.T) {
 | |
| 	r := maketestRouter(testconfig2)
 | |
| 	msg := &config.Message{Text: "test", Channel: "general", Account: "discord.test", Gateway: "bridge1", Protocol: "discord", Username: "test"}
 | |
| 	for _, br := range r.Gateways["bridge1"].Bridges {
 | |
| 		switch br.Account {
 | |
| 		case "discord.test":
 | |
| 			assert.Equal(t, []config.ChannelInfo{{
 | |
| 				Name:        "general",
 | |
| 				Account:     "discord.test",
 | |
| 				Direction:   "inout",
 | |
| 				ID:          "generaldiscord.test",
 | |
| 				SameChannel: map[string]bool{"bridge1": false},
 | |
| 				Options:     config.ChannelOptions{Key: ""},
 | |
| 			}}, r.Gateways["bridge1"].getDestChannel(msg, *br))
 | |
| 		case "slack.test":
 | |
| 			assert.Equal(t, []config.ChannelInfo{{
 | |
| 				Name:        "testing",
 | |
| 				Account:     "slack.test",
 | |
| 				Direction:   "out",
 | |
| 				ID:          "testingslack.test",
 | |
| 				SameChannel: map[string]bool{"bridge1": false},
 | |
| 				Options:     config.ChannelOptions{Key: ""},
 | |
| 			}}, r.Gateways["bridge1"].getDestChannel(msg, *br))
 | |
| 		case "gitter.42wim":
 | |
| 			assert.Equal(t, []config.ChannelInfo(nil), r.Gateways["bridge1"].getDestChannel(msg, *br))
 | |
| 		case "irc.freenode":
 | |
| 			assert.Equal(t, []config.ChannelInfo(nil), r.Gateways["bridge1"].getDestChannel(msg, *br))
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func TestGetDestChannelAdvanced(t *testing.T) {
 | |
| 	r := maketestRouter(testconfig3)
 | |
| 	var msgs []*config.Message
 | |
| 	i := 0
 | |
| 	for _, gw := range r.Gateways {
 | |
| 		for _, channel := range gw.Channels {
 | |
| 			msgs = append(msgs, &config.Message{Text: "text" + strconv.Itoa(i), Channel: channel.Name, Account: channel.Account, Gateway: gw.Name, Username: "user" + strconv.Itoa(i)})
 | |
| 			i++
 | |
| 		}
 | |
| 	}
 | |
| 	hits := make(map[string]int)
 | |
| 	for _, gw := range r.Gateways {
 | |
| 		for _, br := range gw.Bridges {
 | |
| 			for _, msg := range msgs {
 | |
| 				channels := gw.getDestChannel(msg, *br)
 | |
| 				if gw.Name != msg.Gateway {
 | |
| 					assert.Equal(t, []config.ChannelInfo(nil), channels)
 | |
| 					continue
 | |
| 				}
 | |
| 				switch gw.Name {
 | |
| 				case "bridge":
 | |
| 					if (msg.Channel == "#main" || msg.Channel == "-1111111111111" || msg.Channel == "irc") &&
 | |
| 						(msg.Account == ircTestAccount || msg.Account == tgTestAccount || msg.Account == slackTestAccount) {
 | |
| 						hits[gw.Name]++
 | |
| 						switch br.Account {
 | |
| 						case ircTestAccount:
 | |
| 							assert.Equal(t, []config.ChannelInfo{{
 | |
| 								Name:        "#main",
 | |
| 								Account:     ircTestAccount,
 | |
| 								Direction:   "inout",
 | |
| 								ID:          "#mainirc.zzz",
 | |
| 								SameChannel: map[string]bool{"bridge": false},
 | |
| 								Options:     config.ChannelOptions{Key: ""},
 | |
| 							}}, channels)
 | |
| 						case tgTestAccount:
 | |
| 							assert.Equal(t, []config.ChannelInfo{{
 | |
| 								Name:        "-1111111111111",
 | |
| 								Account:     tgTestAccount,
 | |
| 								Direction:   "inout",
 | |
| 								ID:          "-1111111111111telegram.zzz",
 | |
| 								SameChannel: map[string]bool{"bridge": false},
 | |
| 								Options:     config.ChannelOptions{Key: ""},
 | |
| 							}}, channels)
 | |
| 						case slackTestAccount:
 | |
| 							assert.Equal(t, []config.ChannelInfo{{
 | |
| 								Name:        "irc",
 | |
| 								Account:     slackTestAccount,
 | |
| 								Direction:   "inout",
 | |
| 								ID:          "ircslack.zzz",
 | |
| 								SameChannel: map[string]bool{"bridge": false},
 | |
| 								Options:     config.ChannelOptions{Key: ""},
 | |
| 							}}, channels)
 | |
| 						}
 | |
| 					}
 | |
| 				case "bridge2":
 | |
| 					if (msg.Channel == "#main-help" || msg.Channel == "--444444444444") &&
 | |
| 						(msg.Account == ircTestAccount || msg.Account == tgTestAccount) {
 | |
| 						hits[gw.Name]++
 | |
| 						switch br.Account {
 | |
| 						case ircTestAccount:
 | |
| 							assert.Equal(t, []config.ChannelInfo{{
 | |
| 								Name:        "#main-help",
 | |
| 								Account:     ircTestAccount,
 | |
| 								Direction:   "inout",
 | |
| 								ID:          "#main-helpirc.zzz",
 | |
| 								SameChannel: map[string]bool{"bridge2": false},
 | |
| 								Options:     config.ChannelOptions{Key: ""},
 | |
| 							}}, channels)
 | |
| 						case tgTestAccount:
 | |
| 							assert.Equal(t, []config.ChannelInfo{{
 | |
| 								Name:        "--444444444444",
 | |
| 								Account:     tgTestAccount,
 | |
| 								Direction:   "inout",
 | |
| 								ID:          "--444444444444telegram.zzz",
 | |
| 								SameChannel: map[string]bool{"bridge2": false},
 | |
| 								Options:     config.ChannelOptions{Key: ""},
 | |
| 							}}, channels)
 | |
| 						}
 | |
| 					}
 | |
| 				case "bridge3":
 | |
| 					if (msg.Channel == "#main-telegram" || msg.Channel == "--333333333333") &&
 | |
| 						(msg.Account == ircTestAccount || msg.Account == tgTestAccount) {
 | |
| 						hits[gw.Name]++
 | |
| 						switch br.Account {
 | |
| 						case ircTestAccount:
 | |
| 							assert.Equal(t, []config.ChannelInfo{{
 | |
| 								Name:        "#main-telegram",
 | |
| 								Account:     ircTestAccount,
 | |
| 								Direction:   "inout",
 | |
| 								ID:          "#main-telegramirc.zzz",
 | |
| 								SameChannel: map[string]bool{"bridge3": false},
 | |
| 								Options:     config.ChannelOptions{Key: ""},
 | |
| 							}}, channels)
 | |
| 						case tgTestAccount:
 | |
| 							assert.Equal(t, []config.ChannelInfo{{
 | |
| 								Name:        "--333333333333",
 | |
| 								Account:     tgTestAccount,
 | |
| 								Direction:   "inout",
 | |
| 								ID:          "--333333333333telegram.zzz",
 | |
| 								SameChannel: map[string]bool{"bridge3": false},
 | |
| 								Options:     config.ChannelOptions{Key: ""},
 | |
| 							}}, channels)
 | |
| 						}
 | |
| 					}
 | |
| 				case "announcements":
 | |
| 					if msg.Channel != "-2222222222222" && msg.Account != "telegram" {
 | |
| 						assert.Equal(t, []config.ChannelInfo(nil), channels)
 | |
| 						continue
 | |
| 					}
 | |
| 					hits[gw.Name]++
 | |
| 					switch br.Account {
 | |
| 					case ircTestAccount:
 | |
| 						assert.Len(t, channels, 2)
 | |
| 						assert.Contains(t, channels, config.ChannelInfo{
 | |
| 							Name:        "#main",
 | |
| 							Account:     ircTestAccount,
 | |
| 							Direction:   "out",
 | |
| 							ID:          "#mainirc.zzz",
 | |
| 							SameChannel: map[string]bool{"announcements": false},
 | |
| 							Options:     config.ChannelOptions{Key: ""},
 | |
| 						})
 | |
| 						assert.Contains(t, channels, config.ChannelInfo{
 | |
| 							Name:        "#main-help",
 | |
| 							Account:     ircTestAccount,
 | |
| 							Direction:   "out",
 | |
| 							ID:          "#main-helpirc.zzz",
 | |
| 							SameChannel: map[string]bool{"announcements": false},
 | |
| 							Options:     config.ChannelOptions{Key: ""},
 | |
| 						})
 | |
| 					case slackTestAccount:
 | |
| 						assert.Equal(t, []config.ChannelInfo{{
 | |
| 							Name:        "general",
 | |
| 							Account:     slackTestAccount,
 | |
| 							Direction:   "out",
 | |
| 							ID:          "generalslack.zzz",
 | |
| 							SameChannel: map[string]bool{"announcements": false},
 | |
| 							Options:     config.ChannelOptions{Key: ""},
 | |
| 						}}, channels)
 | |
| 					case tgTestAccount:
 | |
| 						assert.Equal(t, []config.ChannelInfo{{
 | |
| 							Name:        "--333333333333",
 | |
| 							Account:     tgTestAccount,
 | |
| 							Direction:   "out",
 | |
| 							ID:          "--333333333333telegram.zzz",
 | |
| 							SameChannel: map[string]bool{"announcements": false},
 | |
| 							Options:     config.ChannelOptions{Key: ""},
 | |
| 						}}, channels)
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	assert.Equal(t, map[string]int{"bridge3": 4, "bridge": 9, "announcements": 3, "bridge2": 4}, hits)
 | |
| }
 | 
