github.com/gobuffalo/buffalo-cli/v2@v2.0.0-alpha.15.0.20200919213536-a7350c8e6799/cli/internal/plugins/pop/test/ref_test.go (about)

     1  package test
     2  
     3  import (
     4  	"context"
     5  	"crypto/rand"
     6  	"encoding/hex"
     7  	"fmt"
     8  	"os"
     9  	"path/filepath"
    10  
    11  	"github.com/gobuffalo/here"
    12  	"github.com/gobuffalo/pop/v5"
    13  )
    14  
    15  type Ref struct {
    16  	here.Info
    17  	TX *pop.Connection
    18  }
    19  
    20  func (r *Ref) Context() context.Context {
    21  	ctx := context.Background()
    22  	ctx = context.WithValue(ctx, "tx", r.TX)
    23  	return ctx
    24  }
    25  
    26  func testerRef() (*Ref, error) {
    27  	b := make([]byte, 10)
    28  	if _, err := rand.Read(b); err != nil {
    29  		return nil, err
    30  	}
    31  
    32  	dir := hex.EncodeToString(b)
    33  	dir = filepath.Join("internal", "testdata", "temp", dir)
    34  	if err := os.MkdirAll(dir, 0755); err != nil {
    35  		return nil, err
    36  	}
    37  
    38  	cd := &pop.ConnectionDetails{
    39  		URL: fmt.Sprintf("sqlite://%s", filepath.Join(dir, "test.db")),
    40  	}
    41  	if err := cd.Finalize(); err != nil {
    42  		return nil, err
    43  	}
    44  	// json.NewEncoder(os.Stdout).Encode(cd)
    45  
    46  	tx, err := pop.NewConnection(cd)
    47  	if err != nil {
    48  		return nil, err
    49  	}
    50  	if err := tx.Open(); err != nil {
    51  		return nil, err
    52  	}
    53  
    54  	y := fmt.Sprintf(dbYml, filepath.Join(dir, "test.db"))
    55  	err = writeFile(filepath.Join(dir, "database.yml"), y)
    56  	if err != nil {
    57  		return nil, err
    58  	}
    59  
    60  	ref := &Ref{
    61  		Info: here.Info{
    62  			Dir: dir,
    63  		},
    64  		TX: tx,
    65  	}
    66  	return ref, nil
    67  }
    68  
    69  func writeSchema(info here.Info, schema string) error {
    70  	fp := filepath.Join(info.Dir, "migrations", "schema.sql")
    71  	return writeFile(fp, schema)
    72  }
    73  
    74  func writeFile(fp string, body string) error {
    75  	if err := os.MkdirAll(filepath.Dir(fp), 0777); err != nil {
    76  		return err
    77  	}
    78  	f, err := os.Create(fp)
    79  	if err != nil {
    80  		return err
    81  	}
    82  	_, err = f.WriteString(body)
    83  	if err != nil {
    84  		return err
    85  	}
    86  	return f.Close()
    87  }
    88  
    89  // type Widget struct {
    90  // 	ID        uuid.UUID
    91  // 	Name      string    `db:"name"`
    92  // 	CreatedAt time.Time `json:"created_at" db:"created_at"`
    93  // 	UpdatedAt time.Time `json:"updated_at" db:"updated_at"`
    94  // }
    95  
    96  const dbYml = `test:
    97    dialect: "sqlite3"
    98    database: "%s"
    99  `
   100  
   101  const dbEmptySchema = `
   102  CREATE TABLE IF NOT EXISTS "schema_migration" (
   103  "version" TEXT NOT NULL
   104  );
   105  CREATE UNIQUE INDEX "schema_migration_version_idx" ON "schema_migration" (version);
   106  `
   107  
   108  const dbWidgetsSchema = `
   109  CREATE TABLE IF NOT EXISTS "schema_migration" (
   110  "version" TEXT NOT NULL
   111  );
   112  CREATE UNIQUE INDEX "schema_migration_version_idx" ON "schema_migration" (version);
   113  CREATE TABLE IF NOT EXISTS "widgets" (
   114  "id" TEXT PRIMARY KEY,
   115  "name" TEXT NOT NULL,
   116  "created_at" DATETIME NOT NULL,
   117  "updated_at" DATETIME NOT NULL
   118  );
   119  `
   120  
   121  const dbWidgetsMigration = `
   122  create_table("widgets") {
   123  	t.Column("id", "uuid", {primary: true})
   124  	t.Column("name", "string", {})
   125  	t.Timestamps()
   126  }
   127  `