github.com/diamondburned/arikawa/v2@v2.1.0/internal/testenv/testenv.go (about) 1 // +build !uintonly 2 3 package testenv 4 5 import ( 6 "os" 7 "sync" 8 "testing" 9 "time" 10 11 "github.com/diamondburned/arikawa/v2/discord" 12 "github.com/pkg/errors" 13 ) 14 15 const PerseveranceTime = 50 * time.Minute 16 17 type Env struct { 18 BotToken string 19 ChannelID discord.ChannelID 20 VoiceChID discord.ChannelID 21 } 22 23 var ( 24 globalEnv Env 25 globalErr error 26 once sync.Once 27 ) 28 29 func Must(t *testing.T) Env { 30 e, err := GetEnv() 31 if err != nil { 32 t.Skip("integration test variables missing") 33 } 34 return e 35 } 36 37 func GetEnv() (Env, error) { 38 once.Do(getEnv) 39 return globalEnv, globalErr 40 } 41 42 func getEnv() { 43 var token = os.Getenv("BOT_TOKEN") 44 if token == "" { 45 globalErr = errors.New("missing $BOT_TOKEN") 46 return 47 } 48 49 var cid = os.Getenv("CHANNEL_ID") 50 if cid == "" { 51 globalErr = errors.New("missing $CHANNEL_ID") 52 return 53 } 54 55 id, err := discord.ParseSnowflake(cid) 56 if err != nil { 57 globalErr = errors.Wrap(err, "invalid $CHANNEL_ID") 58 return 59 } 60 61 var sid = os.Getenv("VOICE_ID") 62 if sid == "" { 63 globalErr = errors.New("missing $VOICE_ID") 64 return 65 } 66 67 vid, err := discord.ParseSnowflake(sid) 68 if err != nil { 69 globalErr = errors.Wrap(err, "invalid $VOICE_ID") 70 return 71 } 72 73 globalEnv = Env{ 74 BotToken: token, 75 ChannelID: discord.ChannelID(id), 76 VoiceChID: discord.ChannelID(vid), 77 } 78 }