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  }