5 changed files with 390 additions and 29 deletions
@ -1,5 +1,8 @@ |
|||||||
run: |
run: |
||||||
SKIP_CAPTCHA=1 go run *.go |
TEST_MODE=1 go run *.go |
||||||
|
|
||||||
|
tests: |
||||||
|
go run test/main.go |
||||||
|
|
||||||
db: |
db: |
||||||
echo 'CREATE TABLE "notes" (`id` VARCHAR(6) UNIQUE PRIMARY KEY, `text` TEXT, `published` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `edited` TIMESTAMP DEFAULT NULL, `password` VARCHAR(16), `views` INTEGER DEFAULT 0);' | sqlite3 database.sqlite |
echo 'CREATE TABLE "notes" (`id` VARCHAR(6) UNIQUE PRIMARY KEY, `text` TEXT, `published` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `edited` TIMESTAMP DEFAULT NULL, `password` VARCHAR(16), `views` INTEGER DEFAULT 0);' | sqlite3 database.sqlite |
||||||
|
|||||||
@ -0,0 +1,344 @@ |
|||||||
|
package main |
||||||
|
|
||||||
|
import ( |
||||||
|
"strings" |
||||||
|
|
||||||
|
simplejson "github.com/bitly/go-simplejson" |
||||||
|
"github.com/verdverm/frisby" |
||||||
|
) |
||||||
|
|
||||||
|
func main() { |
||||||
|
|
||||||
|
service := "http://localhost:3000" |
||||||
|
|
||||||
|
frisby.Create("Test Notehub landing page"). |
||||||
|
Get(service). |
||||||
|
Send(). |
||||||
|
ExpectHeader("Content-Type", "text/html; charset=utf-8"). |
||||||
|
ExpectStatus(200). |
||||||
|
ExpectContent("Pastebin for One-Off Markdown Publishing") |
||||||
|
|
||||||
|
frisby.Create("Test Notehub TOS Page"). |
||||||
|
Get(service+"/TOS.md"). |
||||||
|
Send(). |
||||||
|
ExpectHeader("Content-Type", "text/html; charset=UTF-8"). |
||||||
|
ExpectStatus(200). |
||||||
|
ExpectContent("Terms of Service") |
||||||
|
|
||||||
|
frisby.Create("Test /new page"). |
||||||
|
Get(service+"/new"). |
||||||
|
Send(). |
||||||
|
ExpectHeader("Content-Type", "text/html; charset=UTF-8"). |
||||||
|
ExpectStatus(200). |
||||||
|
ExpectContent("Publish Note") |
||||||
|
|
||||||
|
frisby.Create("Test non-existing page"). |
||||||
|
Get(service+"/xxyyzz"). |
||||||
|
Send(). |
||||||
|
ExpectStatus(404). |
||||||
|
ExpectHeader("Content-Type", "text/plain; charset=UTF-8"). |
||||||
|
ExpectContent("Not found") |
||||||
|
|
||||||
|
frisby.Create("Test non-existing page: query params"). |
||||||
|
Get(service + "/xxyyzz?q=v"). // TODO: test the same for valid note
|
||||||
|
Send(). |
||||||
|
ExpectStatus(404). |
||||||
|
ExpectContent("Not found") |
||||||
|
|
||||||
|
frisby.Create("Test non-existing page: alphabet violation"). |
||||||
|
Get(service + "/login.php"). |
||||||
|
Send(). |
||||||
|
ExpectStatus(404). |
||||||
|
ExpectContent("Not found") |
||||||
|
|
||||||
|
frisby.Create("Test publishing: no input"). |
||||||
|
Post(service+"/"). |
||||||
|
Send(). |
||||||
|
ExpectStatus(412). |
||||||
|
ExpectJson("Success", false). |
||||||
|
ExpectJson("Payload", "Precondition failed") |
||||||
|
|
||||||
|
frisby.Create("Test publishing attempt: only TOS set"). |
||||||
|
Post(service+"/"). |
||||||
|
SetData("tos", "on"). |
||||||
|
Send(). |
||||||
|
ExpectStatus(400). |
||||||
|
ExpectJson("Success", false). |
||||||
|
ExpectJson("Payload", "Bad request: note length not accepted") |
||||||
|
|
||||||
|
testNote := "# Hello World!\nThis is a _test_ note!" |
||||||
|
testNoteHTML := "<h1>Hello World!</h1>\n<p>This is a <em>test</em> note!</p>" |
||||||
|
var id string |
||||||
|
|
||||||
|
tooLongNote := testNote |
||||||
|
for len(tooLongNote) < 50000 { |
||||||
|
tooLongNote += tooLongNote |
||||||
|
} |
||||||
|
|
||||||
|
frisby.Create("Test publishing: too long note"). |
||||||
|
Post(service+"/"). |
||||||
|
SetData("tos", "on"). |
||||||
|
SetData("text", tooLongNote). |
||||||
|
Send(). |
||||||
|
ExpectStatus(400). |
||||||
|
ExpectJson("Success", false). |
||||||
|
ExpectJson("Payload", "Bad request: note length not accepted") |
||||||
|
|
||||||
|
frisby.Create("Test publishing: correct inputs; no password"). |
||||||
|
Post(service+"/"). |
||||||
|
SetData("tos", "on"). |
||||||
|
SetData("text", testNote). |
||||||
|
Send(). |
||||||
|
ExpectStatus(201). |
||||||
|
ExpectJson("Success", true). |
||||||
|
AfterJson(func(F *frisby.Frisby, json *simplejson.Json, err error) { |
||||||
|
noteID, err := json.Get("Payload").String() |
||||||
|
if err != nil { |
||||||
|
F.AddError(err.Error()) |
||||||
|
return |
||||||
|
} |
||||||
|
id = noteID |
||||||
|
}) |
||||||
|
|
||||||
|
frisby.Create("Test retrieval of new note"). |
||||||
|
Get(service + "/" + id). |
||||||
|
Send(). |
||||||
|
// simulate 3 requests (for stats)
|
||||||
|
Get(service + "/" + id). |
||||||
|
Send(). |
||||||
|
Get(service + "/" + id). |
||||||
|
Send(). |
||||||
|
ExpectStatus(200). |
||||||
|
ExpectContent(testNoteHTML) |
||||||
|
|
||||||
|
frisby.Create("Test export of new note"). |
||||||
|
Get(service+"/"+id+"/export"). |
||||||
|
Send(). |
||||||
|
ExpectStatus(200). |
||||||
|
ExpectHeader("Content-type", "text/plain; charset=UTF-8"). |
||||||
|
ExpectContent(testNote) |
||||||
|
|
||||||
|
// TODO: fix this
|
||||||
|
// frisby.Create("Test opening fake service on note").
|
||||||
|
// Get(service + "/" + id + "/asd").
|
||||||
|
// Send().
|
||||||
|
// ExpectStatus(404).
|
||||||
|
// PrintBody().
|
||||||
|
// ExpectContent("Not found")
|
||||||
|
// frisby.Create("Test opening fake service on note 2").
|
||||||
|
// Get(service + "/" + id + "/exports").
|
||||||
|
// Send().
|
||||||
|
// ExpectStatus(404).
|
||||||
|
// ExpectContent("Not found")
|
||||||
|
|
||||||
|
frisby.Create("Test stats of new note"). |
||||||
|
Get(service + "/" + id + "/stats"). |
||||||
|
Send(). |
||||||
|
ExpectStatus(200). |
||||||
|
ExpectContent("<tr><td>Views</td><td>4</td></tr>"). |
||||||
|
ExpectContent("Published") |
||||||
|
|
||||||
|
frisby.Create("Test edit page of new note"). |
||||||
|
Get(service+"/"+id+"/edit"). |
||||||
|
Send(). |
||||||
|
ExpectStatus(200). |
||||||
|
ExpectHeader("Content-type", "text/html; charset=UTF-8"). |
||||||
|
ExpectContent(testNote) |
||||||
|
|
||||||
|
frisby.Create("Test invalid editing attempt: empty inputs"). |
||||||
|
Post(service+"/"). |
||||||
|
SetData("id", id). |
||||||
|
Send(). |
||||||
|
ExpectStatus(412) |
||||||
|
|
||||||
|
frisby.Create("Test invalid editing attempt: tos only"). |
||||||
|
Post(service+"/"). |
||||||
|
SetData("id", id). |
||||||
|
SetData("tos", "on"). |
||||||
|
Send(). |
||||||
|
ExpectStatus(400). |
||||||
|
ExpectJson("Success", false). |
||||||
|
ExpectJson("Payload", "Bad request: password is empty") |
||||||
|
|
||||||
|
frisby.Create("Test invalid editing attempt: tos and password"). |
||||||
|
Post(service+"/"). |
||||||
|
SetData("id", id). |
||||||
|
SetData("tos", "on"). |
||||||
|
SetData("password", "aazzss"). |
||||||
|
Send(). |
||||||
|
ExpectStatus(401). |
||||||
|
ExpectJson("Success", false). |
||||||
|
ExpectJson("Payload", "Unauthorized: password is wrong") |
||||||
|
|
||||||
|
frisby.Create("Test invalid editing attempt: tos and password, but too short note"). |
||||||
|
Post(service+"/"). |
||||||
|
SetData("id", id). |
||||||
|
SetData("tos", "on"). |
||||||
|
SetData("text", "Test"). |
||||||
|
SetData("password", "aazzss"). |
||||||
|
Send(). |
||||||
|
ExpectStatus(400). |
||||||
|
ExpectJson("Success", false). |
||||||
|
ExpectJson("Payload", "Bad request: note length not accepted") |
||||||
|
|
||||||
|
frisby.Create("Test publishing: correct inputs; with password"). |
||||||
|
Post(service+"/"). |
||||||
|
SetData("tos", "on"). |
||||||
|
SetData("password", "aa11qq"). |
||||||
|
SetData("text", testNote). |
||||||
|
Send(). |
||||||
|
ExpectStatus(201). |
||||||
|
ExpectJson("Success", true). |
||||||
|
AfterJson(func(F *frisby.Frisby, json *simplejson.Json, err error) { |
||||||
|
noteID, err := json.Get("Payload").String() |
||||||
|
if err != nil { |
||||||
|
F.AddError(err.Error()) |
||||||
|
return |
||||||
|
} |
||||||
|
id = noteID |
||||||
|
}) |
||||||
|
|
||||||
|
updatedNote := strings.Replace(testNote, "is a", "is an updated", -1) |
||||||
|
frisby.Create("Test invalid editing attempt: tos only"). |
||||||
|
Post(service+"/"). |
||||||
|
SetData("id", id). |
||||||
|
SetData("tos", "on"). |
||||||
|
Send(). |
||||||
|
ExpectStatus(400). |
||||||
|
ExpectJson("Success", false). |
||||||
|
ExpectJson("Payload", "Bad request: password is empty") |
||||||
|
|
||||||
|
frisby.Create("Test invalid editing attempt: tos and wrong password"). |
||||||
|
Post(service+"/"). |
||||||
|
SetData("id", id). |
||||||
|
SetData("tos", "on"). |
||||||
|
SetData("text", updatedNote). |
||||||
|
SetData("password", "aazzss"). |
||||||
|
Send(). |
||||||
|
ExpectStatus(401). |
||||||
|
ExpectJson("Success", false). |
||||||
|
ExpectJson("Payload", "Unauthorized: password is wrong") |
||||||
|
|
||||||
|
frisby.Create("Test editing: valid inputs, no tos"). |
||||||
|
Post(service+"/"). |
||||||
|
SetData("id", id). |
||||||
|
SetData("text", updatedNote). |
||||||
|
SetData("password", "aa11qq"). |
||||||
|
Send(). |
||||||
|
ExpectStatus(412). |
||||||
|
ExpectJson("Success", false). |
||||||
|
ExpectJson("Payload", "Precondition failed") |
||||||
|
|
||||||
|
frisby.Create("Test editing: valid inputs"). |
||||||
|
Post(service+"/"). |
||||||
|
SetData("id", id). |
||||||
|
SetData("tos", "on"). |
||||||
|
SetData("text", updatedNote). |
||||||
|
SetData("password", "aa11qq"). |
||||||
|
Send(). |
||||||
|
ExpectStatus(200). |
||||||
|
ExpectJson("Success", true) |
||||||
|
|
||||||
|
frisby.Create("Test retrieval of updated note"). |
||||||
|
Get(service + "/" + id). |
||||||
|
Send(). |
||||||
|
ExpectStatus(200). |
||||||
|
ExpectContent(strings.Replace(testNoteHTML, "is a", "is an updated", -1)) |
||||||
|
|
||||||
|
frisby.Create("Test export of new note"). |
||||||
|
Get(service+"/"+id+"/export"). |
||||||
|
Send(). |
||||||
|
ExpectStatus(200). |
||||||
|
ExpectHeader("Content-type", "text/plain; charset=UTF-8"). |
||||||
|
ExpectContent(updatedNote) |
||||||
|
|
||||||
|
frisby.Create("Test deletion: valid inputs"). |
||||||
|
Post(service+"/"). |
||||||
|
SetData("id", id). |
||||||
|
SetData("tos", "on"). |
||||||
|
SetData("text", ""). |
||||||
|
SetData("password", "aa11qq"). |
||||||
|
Send(). |
||||||
|
ExpectStatus(200). |
||||||
|
ExpectJson("Success", true) |
||||||
|
|
||||||
|
frisby.Create("Test retrieval of deleted note"). |
||||||
|
Get(service + "/" + id). |
||||||
|
Send(). |
||||||
|
ExpectStatus(404) |
||||||
|
|
||||||
|
fraudNote := "http://n.co https://a.co ftp://b.co" |
||||||
|
|
||||||
|
frisby.Create("Test publishing fraudulent note"). |
||||||
|
Post(service+"/"). |
||||||
|
SetData("tos", "on"). |
||||||
|
SetData("password", "aa22qq"). |
||||||
|
SetData("text", fraudNote). |
||||||
|
Send(). |
||||||
|
ExpectStatus(201). |
||||||
|
ExpectJson("Success", true). |
||||||
|
AfterJson(func(F *frisby.Frisby, json *simplejson.Json, err error) { |
||||||
|
noteID, err := json.Get("Payload").String() |
||||||
|
if err != nil { |
||||||
|
F.AddError(err.Error()) |
||||||
|
return |
||||||
|
} |
||||||
|
id = noteID |
||||||
|
}) |
||||||
|
|
||||||
|
frisby.Create("Test new fraudulent note"). |
||||||
|
Get(service+"/"+id). |
||||||
|
Send(). |
||||||
|
ExpectStatus(200). |
||||||
|
ExpectHeader("Content-type", "text/html; charset=UTF-8"). |
||||||
|
ExpectContent(`<a href="http://n.co">http://n.co</a> <a href="https://a.co">https://a.co</a> <a href="ftp://b.co">ftp://b.co</a>`) |
||||||
|
|
||||||
|
frisby.Create("Test export of fraudulent note"). |
||||||
|
Get(service+"/"+id+"/export"). |
||||||
|
Send(). |
||||||
|
ExpectStatus(200). |
||||||
|
ExpectHeader("Content-type", "text/plain; charset=UTF-8"). |
||||||
|
ExpectContent(fraudNote) |
||||||
|
|
||||||
|
// access fraudulent note more than 100 times
|
||||||
|
f := frisby.Create("Test export of fraudulent note again") |
||||||
|
for i := 0; i < 100; i++ { |
||||||
|
f.Get(service + "/" + id).Send() |
||||||
|
} |
||||||
|
|
||||||
|
frisby.Create("Test stats of fradulent note"). |
||||||
|
Get(service + "/" + id + "/stats"). |
||||||
|
Send(). |
||||||
|
ExpectStatus(200). |
||||||
|
ExpectContent("<tr><td>Views</td><td>102</td></tr>"). |
||||||
|
ExpectContent("Published") |
||||||
|
|
||||||
|
frisby.Create("Test export of fraudulent note"). |
||||||
|
Get(service+"/"+id+"/export"). |
||||||
|
Send(). |
||||||
|
ExpectStatus(403). |
||||||
|
ExpectHeader("Content-type", "text/plain; charset=UTF-8"). |
||||||
|
ExpectContent("Forbidden") |
||||||
|
|
||||||
|
frisby.Create("Test deletion of fraudulent note: wrong password inputs"). |
||||||
|
Post(service+"/"). |
||||||
|
SetData("id", id). |
||||||
|
SetData("tos", "on"). |
||||||
|
SetData("text", ""). |
||||||
|
SetData("password", "aa11qq"). |
||||||
|
Send(). |
||||||
|
ExpectStatus(401). |
||||||
|
ExpectJson("Success", false) |
||||||
|
|
||||||
|
frisby.Create("Test deletion of fraudulent note: correct password inputs"). |
||||||
|
Post(service+"/"). |
||||||
|
SetData("id", id). |
||||||
|
SetData("tos", "on"). |
||||||
|
SetData("text", ""). |
||||||
|
SetData("password", "aa22qq"). |
||||||
|
Send(). |
||||||
|
ExpectStatus(200). |
||||||
|
ExpectJson("Success", true) |
||||||
|
|
||||||
|
frisby.Global.PrintReport() |
||||||
|
} |
||||||
Loading…
Reference in new issue