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 `