2016-02-29 04:30:54 +01:00
|
|
|
package cmds
|
|
|
|
|
2016-03-03 05:14:21 +01:00
|
|
|
import (
|
2016-04-16 07:17:25 +02:00
|
|
|
"bufio"
|
2016-03-03 20:30:48 +01:00
|
|
|
"bytes"
|
2016-04-16 07:17:25 +02:00
|
|
|
"fmt"
|
2016-03-03 20:30:48 +01:00
|
|
|
"io/ioutil"
|
|
|
|
"os"
|
|
|
|
"os/exec"
|
2016-04-16 07:17:25 +02:00
|
|
|
"path/filepath"
|
|
|
|
"regexp"
|
|
|
|
"strconv"
|
2016-03-03 05:14:21 +01:00
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/pobri19/sqlboiler/dbdrivers"
|
|
|
|
)
|
2016-03-02 06:37:14 +01:00
|
|
|
|
2016-03-27 17:03:14 +02:00
|
|
|
var cmdData *CmdData
|
2016-04-16 07:17:25 +02:00
|
|
|
var rgxHasSpaces = regexp.MustCompile(`^\s+`)
|
2016-03-27 17:03:14 +02:00
|
|
|
|
2016-03-02 06:37:14 +01:00
|
|
|
func init() {
|
|
|
|
cmdData = &CmdData{
|
2016-03-23 07:18:41 +01:00
|
|
|
Tables: []dbdrivers.Table{
|
|
|
|
{
|
|
|
|
Name: "patrick_table",
|
|
|
|
Columns: []dbdrivers.Column{
|
|
|
|
{Name: "patrick_column", Type: "string", IsNullable: false},
|
|
|
|
{Name: "aaron_column", Type: "null.String", IsNullable: true},
|
|
|
|
{Name: "id", Type: "null.Int", IsNullable: true},
|
|
|
|
{Name: "fun_id", Type: "int64", IsNullable: false},
|
|
|
|
{Name: "time", Type: "null.Time", IsNullable: true},
|
|
|
|
{Name: "fun_time", Type: "time.Time", IsNullable: false},
|
|
|
|
{Name: "cool_stuff_forever", Type: "[]byte", IsNullable: false},
|
|
|
|
},
|
2016-03-03 20:30:48 +01:00
|
|
|
},
|
2016-03-23 07:18:41 +01:00
|
|
|
{
|
|
|
|
Name: "spiderman",
|
|
|
|
Columns: []dbdrivers.Column{
|
|
|
|
{Name: "patrick", Type: "string", IsNullable: false},
|
|
|
|
},
|
2016-03-02 06:37:14 +01:00
|
|
|
},
|
|
|
|
},
|
2016-04-06 22:10:12 +02:00
|
|
|
PkgName: "patrick",
|
|
|
|
OutFolder: "",
|
|
|
|
DriverName: "postgres",
|
|
|
|
Interface: nil,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestLoadTemplate(t *testing.T) {
|
|
|
|
t.Parallel()
|
|
|
|
|
|
|
|
template, err := loadTemplate("templates_test/main_test", "postgres_main.tpl")
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("Unable to loadTemplate: %s", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if template == nil {
|
|
|
|
t.Fatal("Unable to load template.")
|
2016-03-02 06:37:14 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-03-03 05:14:21 +01:00
|
|
|
func TestTemplates(t *testing.T) {
|
|
|
|
if testing.Short() {
|
|
|
|
t.SkipNow()
|
|
|
|
}
|
2016-03-03 20:30:48 +01:00
|
|
|
|
|
|
|
// Initialize the templates
|
|
|
|
var err error
|
2016-03-27 17:03:14 +02:00
|
|
|
cmdData.Templates, err = loadTemplates("templates")
|
2016-03-03 20:30:48 +01:00
|
|
|
if err != nil {
|
2016-03-04 02:57:22 +01:00
|
|
|
t.Fatalf("Unable to initialize templates: %s", err)
|
2016-03-03 20:30:48 +01:00
|
|
|
}
|
|
|
|
|
2016-04-03 08:01:26 +02:00
|
|
|
if len(cmdData.Templates) == 0 {
|
|
|
|
t.Errorf("Templates is empty.")
|
|
|
|
}
|
|
|
|
|
2016-04-19 04:02:32 +02:00
|
|
|
cmdData.SingleTemplates, err = loadTemplates("templates/singles")
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("Unable to initialize single templates: %s", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(cmdData.SingleTemplates) == 0 {
|
|
|
|
t.Errorf("SingleTemplates is empty.")
|
|
|
|
}
|
|
|
|
|
2016-04-03 08:01:26 +02:00
|
|
|
cmdData.TestTemplates, err = loadTemplates("templates_test")
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("Unable to initialize templates: %s", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(cmdData.Templates) == 0 {
|
|
|
|
t.Errorf("Templates is empty.")
|
|
|
|
}
|
|
|
|
|
2016-04-06 22:10:12 +02:00
|
|
|
cmdData.TestMainTemplate, err = loadTemplate("templates_test/main_test", "postgres_main.tpl")
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("Unable to initialize templates: %s", err)
|
|
|
|
}
|
|
|
|
|
2016-03-03 20:30:48 +01:00
|
|
|
cmdData.OutFolder, err = ioutil.TempDir("", "templates")
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("Unable to create tempdir: %s", err)
|
|
|
|
}
|
|
|
|
defer os.RemoveAll(cmdData.OutFolder)
|
|
|
|
|
2016-04-03 08:01:26 +02:00
|
|
|
if err = cmdData.run(true); err != nil {
|
|
|
|
t.Errorf("Unable to run SQLBoilerRun: %s", err)
|
|
|
|
}
|
2016-03-03 20:30:48 +01:00
|
|
|
|
2016-04-16 07:17:25 +02:00
|
|
|
buf := &bytes.Buffer{}
|
2016-03-23 04:03:35 +01:00
|
|
|
|
2016-04-06 22:10:12 +02:00
|
|
|
cmd := exec.Command("go", "test", "-c")
|
2016-03-03 20:30:48 +01:00
|
|
|
cmd.Dir = cmdData.OutFolder
|
2016-04-16 07:17:25 +02:00
|
|
|
cmd.Stderr = buf
|
2016-03-03 20:30:48 +01:00
|
|
|
|
|
|
|
if err = cmd.Run(); err != nil {
|
2016-04-16 07:17:25 +02:00
|
|
|
t.Errorf("go test cmd execution failed: %s", err)
|
|
|
|
outputCompileErrors(buf, cmdData.OutFolder)
|
|
|
|
fmt.Println()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func outputCompileErrors(buf *bytes.Buffer, outFolder string) {
|
|
|
|
type errObj struct {
|
|
|
|
errMsg string
|
|
|
|
fileName string
|
|
|
|
lineNumber int
|
|
|
|
}
|
|
|
|
|
|
|
|
var errObjects []errObj
|
|
|
|
lineBuf := &bytes.Buffer{}
|
|
|
|
|
|
|
|
bufLines := bytes.Split(buf.Bytes(), []byte{'\n'})
|
|
|
|
for i := 0; i < len(bufLines); i++ {
|
|
|
|
lineBuf.Reset()
|
|
|
|
if !bytes.HasPrefix(bufLines[i], []byte("./")) {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
fmt.Fprintf(lineBuf, "%s\n", bufLines[i])
|
|
|
|
|
|
|
|
splits := bytes.Split(bufLines[i], []byte{':'})
|
|
|
|
lineNum, err := strconv.Atoi(string(splits[1]))
|
|
|
|
if err != nil {
|
|
|
|
panic(fmt.Sprintf("Cant convert line number to int: %s", bufLines[i]))
|
|
|
|
}
|
|
|
|
|
|
|
|
eObj := errObj{
|
|
|
|
fileName: string(splits[0]),
|
|
|
|
lineNumber: lineNum,
|
|
|
|
}
|
|
|
|
|
|
|
|
for y := i; y < len(bufLines); y++ {
|
|
|
|
if !rgxHasSpaces.Match(bufLines[y]) {
|
|
|
|
break
|
|
|
|
}
|
|
|
|
fmt.Fprintf(lineBuf, "%s\n", bufLines[y])
|
|
|
|
i++
|
|
|
|
}
|
|
|
|
|
|
|
|
eObj.errMsg = lineBuf.String()
|
|
|
|
|
|
|
|
errObjects = append(errObjects, eObj)
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, eObj := range errObjects {
|
|
|
|
fmt.Printf("-----------------\n")
|
|
|
|
fmt.Println(eObj.errMsg)
|
|
|
|
|
|
|
|
filePath := filepath.Join(outFolder, eObj.fileName)
|
|
|
|
fh, err := os.Open(filePath)
|
|
|
|
if err != nil {
|
|
|
|
panic(fmt.Sprintf("Cant open the file: %#v", eObj))
|
|
|
|
}
|
|
|
|
|
|
|
|
scanner := bufio.NewScanner(fh)
|
|
|
|
throwaway := eObj.lineNumber - 2
|
|
|
|
for throwaway > 0 && scanner.Scan() {
|
|
|
|
throwaway--
|
|
|
|
}
|
|
|
|
|
|
|
|
for i := 0; i < 3; i++ {
|
|
|
|
if scanner.Scan() {
|
|
|
|
b := scanner.Bytes()
|
|
|
|
if len(b) != 0 {
|
|
|
|
fmt.Printf("%s\n", b)
|
|
|
|
} else {
|
|
|
|
i--
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fh.Close()
|
2016-03-03 20:30:48 +01:00
|
|
|
}
|
2016-03-03 05:14:21 +01:00
|
|
|
}
|