| package exporter |
| |
| import ( |
| "strings" |
| "testing" |
| |
| "github.com/stretchr/testify/assert" |
| ) |
| |
| type testTables struct { |
| TableOne []tableOneRow |
| TableTwo []tableTwoRow |
| } |
| |
| type tableOneRow struct { |
| ColumnOne string `sql:"column_one STRING PRIMARY KEY"` |
| ColumnTwo int `sql:"column_two INT8 NOT NULL"` |
| } |
| |
| type tableTwoRow struct { |
| CompositeKeyOne []byte `sql:"comp_one BYTES"` |
| CompositeKeyTwo []byte `sql:"comp_two BYTES"` |
| // This is a test comment |
| primaryKey struct{} `sql:"PRIMARY KEY (comp_one, comp_two)"` |
| // We have this index for good reasons. Spaces are intentional to make sure they are trimmed |
| indexForSearch struct{} `sql:" INDEX comp_two_desc_idx (comp_two DESC) "` |
| // We have this index for even better reasons. |
| otherIndex struct{} `sql:"INDEX comp_two_asc_idx (comp_two ASC)"` |
| } |
| |
| func TestGenerateSQL_WellFormedInput_CorrectOutput(t *testing.T) { |
| |
| gen := GenerateSQL(testTables{}, "test_package_one", SchemaOnly) |
| // We cannot have backticks in the multistring literal, so we substitute $$ for them. |
| expectedOutput := strings.ReplaceAll(`package test_package_one |
| |
| // Generated by //go/sql/exporter/ |
| // DO NOT EDIT |
| |
| const Schema = $$CREATE TABLE IF NOT EXISTS TableOne ( |
| column_one STRING PRIMARY KEY, |
| column_two INT8 NOT NULL |
| ); |
| CREATE TABLE IF NOT EXISTS TableTwo ( |
| comp_one BYTES, |
| comp_two BYTES, |
| PRIMARY KEY (comp_one, comp_two), |
| INDEX comp_two_desc_idx (comp_two DESC), |
| INDEX comp_two_asc_idx (comp_two ASC) |
| ); |
| $$ |
| `, "$$", "`") |
| |
| assert.Equal(t, expectedOutput, gen) |
| } |
| |
| func TestGenerateSQL_WellFormedInput_CorrectOutputIncludingColumnNames(t *testing.T) { |
| |
| gen := GenerateSQL(testTables{}, "test_package_one", SchemaAndColumnNames) |
| // We cannot have backticks in the multistring literal, so we substitute $$ for them. |
| expectedOutput := strings.ReplaceAll(`package test_package_one |
| |
| // Generated by //go/sql/exporter/ |
| // DO NOT EDIT |
| |
| const Schema = $$CREATE TABLE IF NOT EXISTS TableOne ( |
| column_one STRING PRIMARY KEY, |
| column_two INT8 NOT NULL |
| ); |
| CREATE TABLE IF NOT EXISTS TableTwo ( |
| comp_one BYTES, |
| comp_two BYTES, |
| PRIMARY KEY (comp_one, comp_two), |
| INDEX comp_two_desc_idx (comp_two DESC), |
| INDEX comp_two_asc_idx (comp_two ASC) |
| ); |
| $$ |
| |
| var TableOne = []string{ |
| "column_one", |
| "column_two", |
| } |
| |
| var TableTwo = []string{ |
| "comp_one", |
| "comp_two", |
| } |
| `, "$$", "`") |
| |
| assert.Equal(t, expectedOutput, gen) |
| } |
| |
| type malformedTable struct { |
| TableOne []tableOneRow |
| TableTwo tableTwoRow |
| } |
| |
| func TestGenerateSQL_NonSliceField_Panics(t *testing.T) { |
| |
| assert.Panics(t, func() { |
| GenerateSQL(malformedTable{}, "test_package_one", SchemaOnly) |
| }) |
| } |
| |
| type missingSQLStructs struct { |
| TableOne []tableOneRow |
| TableTwo []malformedTable |
| } |
| |
| func TestGenerateSQL_MissingSQLStructTag_Panics(t *testing.T) { |
| |
| assert.Panics(t, func() { |
| GenerateSQL(missingSQLStructs{}, "test_package_one", SchemaOnly) |
| }) |
| } |