diff options
Diffstat (limited to 'tests/papod.go')
-rw-r--r-- | tests/papod.go | 560 |
1 files changed, 340 insertions, 220 deletions
diff --git a/tests/papod.go b/tests/papod.go index 2d908f5..5f07b43 100644 --- a/tests/papod.go +++ b/tests/papod.go @@ -4,14 +4,146 @@ import ( "bufio" "database/sql" "errors" + "fmt" + "os" "strings" - // "q" + "golite" + "guuid" g "gobang" ) +func test_defaultPrefix() { + g.TestStart("defaultPrefix") + + g.Testing("the defaultPrefix is valid", func() { + g.TErrorIf(g.ValidateSQLTablePrefix(defaultPrefix)) + }) +} + +func test_tryRollback() { + // FIXME +} + +func test_inTx() { + // FIXME +} + +func test_createTables() { + return + g.TestStart("createTables()") + + db, err := sql.Open(golite.DriverName, ":memory:") + g.TErrorIf(err) + defer db.Close() + + + g.Testing("tables exist afterwards", func() { + const tmpl_read = ` + SELECT id FROM "%s_events" LIMIT 1; + ` + qRead := fmt.Sprintf(tmpl_read, defaultPrefix) + + _, err := db.Exec(qRead) + g.TErrorNil(err) + + err = createTables(db, defaultPrefix) + g.TErrorIf(err) + + _, err = db.Exec(qRead) + g.TErrorIf(err) + }) + + g.Testing("we can do it multiple times", func() { + g.TErrorIf(g.SomeError( + createTables(db, defaultPrefix), + createTables(db, defaultPrefix), + createTables(db, defaultPrefix), + )) + }) +} + +func test_addNetworkStmt() { + return + g.TestStart("addNetworkStmt()") + + const ( + prefix = defaultPrefix + ) + + db, err := sql.Open(golite.DriverName, ":memory:") + g.TErrorIf(err) + g.TErrorIf(createTables(db, prefix)) + + addNetwork, addNetworkClose, addNetworkErr := addNetworkStmt(db, prefix) + g.TErrorIf(addNetworkErr) + defer g.SomeFnError( + addNetworkClose, + ) + + + g.Testing("we can't add the same network twice", func() { + // FIXME + }) + + g.Testing("a user can create multiple networks", func() { + userID := guuid.New() + newNetwork := newNetworkT{} + + network, err := addNetwork(userID, newNetwork) + g.TErrorIf(err) + + g.TAssertEqual(network.createdBy, userID) + }) +} + +func test_addChannelStmt() { + return // FIXME + g.TestStart("addChannelStmt()") + + const ( + prefix = defaultPrefix + ) + + db, err := sql.Open(golite.DriverName, ":memory:") + g.TErrorIf(err) + g.TErrorIf(createTables(db, prefix)) + + addChannel, addChannelClose, addChannelErr := addChannelStmt(db, prefix) + channels, channelsClose, channelsErr := channelsStmt(db, prefix) + g.TErrorIf(g.SomeError( + addChannelErr, + channelsErr, + )) + defer g.SomeFnError( + addChannelClose, + channelsClose, + db.Close, + ) + + collect := func(workspaceID guuid.UUID) []channelT { + rows, err := channels(workspaceID) + g.TErrorIf(err) + + collected := []channelT{} + err = channelEach(rows, func(channel channelT) error { + collected = append(collected, channel) + return nil + }) + g.TErrorIf(err) + return collected + } + + + if true { + g.TAssertEqual(addChannel, collect) + } + // private channels one is not a part of doesn't show up + // channels only from the same workspace +} + func test_initDB() { g.TestStart("initDB()") @@ -39,50 +171,50 @@ func test_initDB() { */ } -func test_SplitOnCRLF() { - type tableT struct { - input string +func test_splitOnCRLF() { + type tableT struct{ + input string expected []string } - table := []tableT { + table := []tableT{ { "", nil, }, { "\r\n", - []string { "" }, + []string{ "" }, }, { "abc\r\n", - []string { "abc" }, + []string{ "abc" }, }, { "abc\r\n ", - []string { "abc" }, + []string{ "abc" }, }, { "abc\r\n \r\n", - []string { "abc", " " }, + []string{ "abc", " " }, }, { " \r\n \r\n", - []string { " ", " " }, + []string{ " ", " " }, }, { "aaa\r\nbbb\r\nccc\r\n", - []string { "aaa", "bbb", "ccc" }, + []string{ "aaa", "bbb", "ccc" }, }, { "\r\nsplit \r \n CRLF\r\n\r\n", - []string { "", "split \r \n CRLF", "" }, + []string{ "", "split \r \n CRLF", "" }, }, } for _, entry := range table { var given []string scanner := bufio.NewScanner(strings.NewReader(entry.input)) - scanner.Split(SplitOnCRLF) + scanner.Split(splitOnCRLF) for scanner.Scan() { given = append(given, scanner.Text()) } @@ -93,19 +225,19 @@ func test_SplitOnCRLF() { } } -func test_SplitOnRawMessage() { - type tableT struct { +func test_splitOnRawMessage() { + type tableT struct{ input string expected []string } - table := []tableT { + table := []tableT{ { "first message\r\nsecond message\r\n", - []string { "first message", "second message" }, + []string{ "first message", "second message" }, }, { "message 1\r\n\r\nmessage 2\r\n\r\nignored", - []string { "message 1", "message 2" }, + []string{ "message 1", "message 2" }, }, } @@ -113,7 +245,7 @@ func test_SplitOnRawMessage() { for _, entry := range table { var given []string scanner := bufio.NewScanner(strings.NewReader(entry.input)) - scanner.Split(SplitOnRawMessage) + scanner.Split(splitOnRawMessage) for scanner.Scan() { given = append(given, scanner.Text()) } @@ -124,333 +256,333 @@ func test_SplitOnRawMessage() { } } -func test_ParseMessageParams() { - type tableT struct { - input string - expected MessageParams +func test_parseMessageParams() { + type tableT struct{ + input string + expected messageParamsT } - table := []tableT { + table := []tableT{ { "", - MessageParams { - Middle: []string { }, - Trailing: "", + messageParamsT{ + middle: []string { }, + trailing: "", }, }, { " ", - MessageParams { - Middle: []string { }, - Trailing: "", + messageParamsT{ + middle: []string { }, + trailing: "", }, }, { " :", - MessageParams { - Middle: []string { }, - Trailing: "", + messageParamsT{ + middle: []string { }, + trailing: "", }, }, { " : ", - MessageParams { - Middle: []string { }, - Trailing: " ", + messageParamsT{ + middle: []string { }, + trailing: " ", }, }, { ": ", - MessageParams { - Middle: []string { ":" }, - Trailing: "", + messageParamsT{ + middle: []string { ":" }, + trailing: "", }, }, { ": ", - MessageParams { - Middle: []string { ":" }, - Trailing: "", + messageParamsT{ + middle: []string { ":" }, + trailing: "", }, }, { " : ", - MessageParams { - Middle: []string { }, - Trailing: " ", + messageParamsT{ + middle: []string { }, + trailing: " ", }, }, { " :", - MessageParams { - Middle: []string { }, - Trailing: "", + messageParamsT{ + middle: []string { }, + trailing: "", }, }, { " :", - MessageParams { - Middle: []string { }, - Trailing: "", + messageParamsT{ + middle: []string { }, + trailing: "", }, }, { "a", - MessageParams { - Middle: []string { "a" }, - Trailing: "", + messageParamsT{ + middle: []string { "a" }, + trailing: "", }, }, { "ab", - MessageParams { - Middle: []string { "ab" }, - Trailing: "", + messageParamsT{ + middle: []string { "ab" }, + trailing: "", }, }, { "a b", - MessageParams { - Middle: []string { "a", "b" }, - Trailing: "", + messageParamsT{ + middle: []string { "a", "b" }, + trailing: "", }, }, { "a b c", - MessageParams { - Middle: []string { "a", "b", "c" }, - Trailing: "", + messageParamsT{ + middle: []string { "a", "b", "c" }, + trailing: "", }, }, { "a b:c", - MessageParams { - Middle: []string { "a", "b:c" }, - Trailing: "", + messageParamsT{ + middle: []string { "a", "b:c" }, + trailing: "", }, }, { "a b:c:", - MessageParams { - Middle: []string { "a", "b:c:" }, - Trailing: "", + messageParamsT{ + middle: []string { "a", "b:c:" }, + trailing: "", }, }, { "a b :c", - MessageParams { - Middle: []string { "a", "b" }, - Trailing: "c", + messageParamsT{ + middle: []string { "a", "b" }, + trailing: "c", }, }, { "a b :c:", - MessageParams { - Middle: []string { "a", "b" }, - Trailing: "c:", + messageParamsT{ + middle: []string { "a", "b" }, + trailing: "c:", }, }, { "a b :c ", - MessageParams { - Middle: []string { "a", "b" }, - Trailing: "c ", + messageParamsT{ + middle: []string { "a", "b" }, + trailing: "c ", }, }, { "a b : c", - MessageParams { - Middle: []string { "a", "b" }, - Trailing: " c", + messageParamsT{ + middle: []string { "a", "b" }, + trailing: " c", }, }, { "a b : c ", - MessageParams { - Middle: []string { "a", "b" }, - Trailing: " c ", + messageParamsT{ + middle: []string { "a", "b" }, + trailing: " c ", }, }, { "a b : c :", - MessageParams { - Middle: []string { "a", "b" }, - Trailing: " c :", + messageParamsT{ + middle: []string { "a", "b" }, + trailing: " c :", }, }, { "a b : c : ", - MessageParams { - Middle: []string { "a", "b" }, - Trailing: " c : ", + messageParamsT{ + middle: []string { "a", "b" }, + trailing: " c : ", }, }, { "a b : c :d", - MessageParams { - Middle: []string { "a", "b" }, - Trailing: " c :d", + messageParamsT{ + middle: []string { "a", "b" }, + trailing: " c :d", }, }, { "a b : c :d ", - MessageParams { - Middle: []string { "a", "b" }, - Trailing: " c :d ", + messageParamsT{ + middle: []string { "a", "b" }, + trailing: " c :d ", }, }, { "a b : c : d ", - MessageParams { - Middle: []string { "a", "b" }, - Trailing: " c : d ", + messageParamsT{ + middle: []string { "a", "b" }, + trailing: " c : d ", }, }, } for _, entry := range table { - given := ParseMessageParams(entry.input) + given := parseMessageParams(entry.input) g.TAssertEqual(given, entry.expected) } } -func test_ParseMessage() { - type tableTOK struct { - input string - expected Message +func test_parseMessage() { + type tableTOK struct{ + input string + expected messageT } tableOK := []tableTOK {{ "NICK joebloe ", - Message { - Prefix: "", - Command: "NICK", - Params: MessageParams { - Middle: []string { "joebloe" }, - Trailing: "", + messageT{ + prefix: "", + command: "NICK", + params: messageParamsT{ + middle: []string { "joebloe" }, + trailing: "", }, - Raw: "NICK joebloe ", + raw: "NICK joebloe ", }, }, { "USER joebloe 0.0.0.0 joe :Joe Bloe", - Message { - Prefix: "", - Command: "USER", - Params: MessageParams { - Middle: []string { + messageT{ + prefix: "", + command: "USER", + params: messageParamsT{ + middle: []string { "joebloe", "0.0.0.0", "joe", }, - Trailing: "Joe Bloe", + trailing: "Joe Bloe", }, - Raw: "USER joebloe 0.0.0.0 joe :Joe Bloe", + raw: "USER joebloe 0.0.0.0 joe :Joe Bloe", }, }, { ":pre USER joebloe 0.0.0.0 joe :Joe Bloe", - Message { - Prefix: "pre", - Command: "USER", - Params: MessageParams { - Middle: []string { + messageT{ + prefix: "pre", + command: "USER", + params: messageParamsT{ + middle: []string { "joebloe", "0.0.0.0", "joe", }, - Trailing: "Joe Bloe", + trailing: "Joe Bloe", }, - Raw: ":pre USER joebloe 0.0.0.0 joe :Joe Bloe", + raw: ":pre USER joebloe 0.0.0.0 joe :Joe Bloe", }, }, { ":pre USER joebloe 0.0.0.0 joe : Joe Bloe ", - Message { - Prefix: "pre", - Command: "USER", - Params: MessageParams { - Middle: []string { + messageT{ + prefix: "pre", + command: "USER", + params: messageParamsT{ + middle: []string { "joebloe", "0.0.0.0", "joe", }, - Trailing: " Joe Bloe ", + trailing: " Joe Bloe ", }, - Raw: ":pre USER joebloe 0.0.0.0 joe : Joe Bloe ", + raw: ":pre USER joebloe 0.0.0.0 joe : Joe Bloe ", }, }, { ":pre USER joebloe: 0:0:0:1 joe::a: : Joe Bloe ", - Message { - Prefix: "pre", - Command: "USER", - Params: MessageParams { - Middle: []string { + messageT{ + prefix: "pre", + command: "USER", + params: messageParamsT{ + middle: []string { "joebloe:", "0:0:0:1", "joe::a:", }, - Trailing: " Joe Bloe ", + trailing: " Joe Bloe ", }, - Raw: ":pre USER joebloe: 0:0:0:1 joe::a: : Joe Bloe ", + raw: ":pre USER joebloe: 0:0:0:1 joe::a: : Joe Bloe ", }, }, { ":pre USER :Joe Bloe", - Message { - Prefix: "pre", - Command: "USER", - Params: MessageParams { - Middle: []string { }, - Trailing: "Joe Bloe", + messageT{ + prefix: "pre", + command: "USER", + params: messageParamsT{ + middle: []string { }, + trailing: "Joe Bloe", }, - Raw: ":pre USER :Joe Bloe", + raw: ":pre USER :Joe Bloe", }, }, { ":pre USER : Joe Bloe", - Message { - Prefix: "pre", - Command: "USER", - Params: MessageParams { - Middle: []string { }, - Trailing: " Joe Bloe", + messageT{ + prefix: "pre", + command: "USER", + params: messageParamsT{ + middle: []string { }, + trailing: " Joe Bloe", }, - Raw: ":pre USER : Joe Bloe", + raw: ":pre USER : Joe Bloe", }, }, { ":pre USER : Joe Bloe", - Message { - Prefix: "pre", - Command: "USER", - Params: MessageParams { - Middle: []string { }, - Trailing: " Joe Bloe", + messageT{ + prefix: "pre", + command: "USER", + params: messageParamsT{ + middle: []string { }, + trailing: " Joe Bloe", }, - Raw: ":pre USER : Joe Bloe", + raw: ":pre USER : Joe Bloe", }, }, { ":pre USER : ", - Message { - Prefix: "pre", - Command: "USER", - Params: MessageParams { - Middle: []string { }, - Trailing: " ", + messageT{ + prefix: "pre", + command: "USER", + params: messageParamsT{ + middle: []string { }, + trailing: " ", }, - Raw: ":pre USER : ", + raw: ":pre USER : ", }, }, { ":pre USER :", - Message { - Prefix: "pre", - Command: "USER", - Params: MessageParams { - Middle: []string { }, - Trailing: "", + messageT{ + prefix: "pre", + command: "USER", + params: messageParamsT{ + middle: []string { }, + trailing: "", }, - Raw: ":pre USER :", + raw: ":pre USER :", }, }} for _, entry := range tableOK { - given, err := ParseMessage(entry.input) + given, err := parseMessage(entry.input) g.TErrorIf(err) g.TAssertEqual(given, entry.expected) } - type tableErrorT struct { - input string + type tableErrorT struct{ + input string expected error } parseErr := errors.New("Can't parse message") - tableError := []tableErrorT { + tableError := []tableErrorT{ { ":pre", parseErr, @@ -466,59 +598,47 @@ func test_ParseMessage() { } for _, entry := range tableError { - _, given := ParseMessage(entry.input) + _, given := parseMessage(entry.input) g.TAssertEqual(given, entry.expected) } } -func test_InitMigrations() { - const query = `SELECT filename FROM migrations;` - - db, err := sql.Open("sqlite3", ":memory:") - g.FatalIf(err) - - _, err = db.Query(query) - g.TAssertEqual(err.Error(), "no such table: migrations") - for i := 0; i < 5; i++ { - InitMigrations(db) - rows, err := db.Query(query) - g.FatalIf(err) - g.TAssertEqual(rows.Next(), false) - g.FatalIf(rows.Err()) +func dumpQueries() { + queries := []struct{name string; fn func(string) queryT}{ + { "createTables", createTablesSQL }, + { "addNetwork", addNetworkSQL }, + { "addChannel", addChannelSQL }, + { "channels", channelsSQL }, + { "allAfter", allAfterSQL }, + { "addEvent", addEventSQL }, } -} - -func test_PendingMigrations() { - db, err := sql.Open("sqlite3", ":memory:") - g.FatalIf(err) - - InitMigrations(db) - pending1 := PendingMigrations(db) - pending2 := PendingMigrations(db) - - g.TAssertEqual(pending1, pending2) -} - -func test_RunMigrations() { - db, err := sql.Open("sqlite3", ":memory:") - g.FatalIf(err) - - for i := 0; i < 5; i++ { - RunMigrations(db) + for _, query := range queries { + q := query.fn(defaultPrefix) + fmt.Printf("\n-- %s.sql:", query.name) + fmt.Printf("\n-- write:%s\n", q.write) + fmt.Printf("\n-- read:%s\n", q.read) } } func MainTest() { + if os.Getenv("TESTING_DUMP_SQL_QUERIES") != "" { + dumpQueries() + return + } + + g.Init() + test_defaultPrefix() + test_tryRollback() + test_inTx() + test_createTables() + test_addNetworkStmt() + test_addChannelStmt() test_initDB() - test_SplitOnCRLF() - test_SplitOnRawMessage() - test_ParseMessageParams() - test_ParseMessage() - - // { "TestInitMigrations", TestInitMigrations }, - // { "TestPendingMigrations", TestPendingMigrations }, - // { "TestRunMigrations", TestRunMigrations }, + test_splitOnCRLF() + test_splitOnRawMessage() + test_parseMessageParams() + test_parseMessage() } |