Skip to content

Commit 5fd21dc

Browse files
committed
start of work on url parameters; adds gorilla/mux to example pkg
1 parent 1a785ab commit 5fd21dc

11 files changed

+211
-122
lines changed

Diff for: example/foos.go

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package main
2+
3+
import "net/http"
4+
5+
// Foo is something cool
6+
type Foo struct {
7+
B string
8+
A string
9+
R string
10+
}
11+
12+
// HandleGetFoos retrieves the collection of Foos
13+
func HandleGetFoos(w http.ResponseWriter, r *http.Request) {
14+
15+
}
16+
17+
// HandleGetFoo retrieves a single Foo
18+
func HandleGetFoo(w http.ResponseWriter, r *http.Request) {
19+
20+
}

Diff for: example/foos_test.go

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package main
2+
3+
import "net/http"
4+
5+
func (t *mainSuite) TestHandleGetFoos() {
6+
resp, err := http.Get(server.URL + "/foos")
7+
t.Must(t.Nil(err))
8+
9+
t.Must(t.Equal(resp.StatusCode, http.StatusOK))
10+
11+
// b, err := ioutil.ReadAll(resp.Body)
12+
// resp.Body.Close()
13+
// t.Must(t.Nil(err))
14+
15+
// TODO: finish test
16+
}
17+
18+
func (t *mainSuite) TestHandleGetFoo() {
19+
resp, err := http.Get(server.URL + "/foos/1")
20+
t.Must(t.Nil(err))
21+
22+
t.Must(t.Equal(resp.StatusCode, http.StatusOK))
23+
24+
// b, err := ioutil.ReadAll(resp.Body)
25+
// resp.Body.Close()
26+
// t.Must(t.Nil(err))
27+
// TODO: finish test
28+
}

Diff for: example/handlers.go

-47
This file was deleted.

Diff for: example/init_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ type mainSuite struct {
1717
func TestRunner(t *testing.T) {
1818
var err error
1919

20-
server, err = test.NewServer(newMux(), ".")
20+
server, err = test.NewServer(newRouter(), ".")
2121
if err != nil {
2222
panic(err.Error())
2323
}

Diff for: example/main.go

-27
This file was deleted.

Diff for: example/main_test.go

-47
This file was deleted.

Diff for: example/server.go

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package main
2+
3+
// JSON Placeholder API
4+
// Fake Online REST API for Testing and Prototyping
5+
// http://jsonplaceholder.typicode.com
6+
7+
import (
8+
"fmt"
9+
"log"
10+
"net/http"
11+
12+
"github.com/gorilla/mux"
13+
)
14+
15+
func main() {
16+
router := newRouter()
17+
log.Fatal(http.ListenAndServe(":8080", router))
18+
}
19+
20+
func newRouter() *mux.Router {
21+
r := mux.NewRouter()
22+
r.HandleFunc("/", HandleGetInfo).Methods("GET")
23+
24+
r.HandleFunc("/foos", HandleGetFoos).Methods("GET")
25+
r.HandleFunc("/foos/{key}", HandleGetFoo).Methods("GET")
26+
27+
r.HandleFunc("/widgets", HandleGetWidgets).Methods("GET")
28+
r.HandleFunc("/widgets", HandlePostWidget).Methods("POST")
29+
r.HandleFunc("/widgets/{id}", HandleGetWidget).Methods("GET")
30+
31+
return r
32+
}
33+
34+
// HandleGetInfo serves basic info about the Server resource to
35+
// the client
36+
func HandleGetInfo(w http.ResponseWriter, r *http.Request) {
37+
if r.Method != "GET" {
38+
HandleNotFound(w)
39+
return
40+
}
41+
42+
fmt.Fprintf(w, "TODO")
43+
}
44+
45+
// HandleNotFound is the basic 404 handler
46+
func HandleNotFound(w http.ResponseWriter) {
47+
http.Error(w, "Not found", http.StatusNotFound)
48+
}

Diff for: example/server_test.go

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package main
2+
3+
import (
4+
"io/ioutil"
5+
"net/http"
6+
)
7+
8+
func (t *mainSuite) TestHandleGetInfo() {
9+
resp, err := http.Get(server.URL)
10+
t.Must(t.Nil(err))
11+
12+
t.Must(t.Equal(resp.StatusCode, http.StatusOK))
13+
14+
info, err := ioutil.ReadAll(resp.Body)
15+
resp.Body.Close()
16+
t.Must(t.Nil(err))
17+
18+
t.Equal(string(info), "TODO")
19+
}

Diff for: example/widgets.go

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package main
2+
3+
import "net/http"
4+
5+
// Widget is a thing
6+
type Widget struct {
7+
Name string
8+
Role string
9+
}
10+
11+
// HandleGetWidgets retrieves the collection of Wisdget
12+
func HandleGetWidgets(w http.ResponseWriter, r *http.Request) {
13+
14+
}
15+
16+
// HandleGetWidget retrieves a single Widget
17+
func HandleGetWidget(w http.ResponseWriter, r *http.Request) {
18+
19+
}
20+
21+
// HandlePostWidget adds a Widget to the collection
22+
func HandlePostWidget(w http.ResponseWriter, r *http.Request) {
23+
24+
}

Diff for: example/widgets_test.go

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package main
2+
3+
import (
4+
"bytes"
5+
"encoding/json"
6+
"net/http"
7+
)
8+
9+
func (t *mainSuite) TestHandleGetWidgets() {
10+
resp, err := http.Get(server.URL + "/widgets")
11+
t.Must(t.Nil(err))
12+
13+
t.Must(t.Equal(resp.StatusCode, http.StatusOK))
14+
15+
// b, err := ioutil.ReadAll(resp.Body)
16+
// resp.Body.Close()
17+
// t.Must(t.Nil(err))
18+
// TODO: finish test
19+
}
20+
21+
func (t *mainSuite) TestHandlePostWidget() {
22+
widget := Widget{
23+
Name: "anotherwidget",
24+
Role: "controller",
25+
}
26+
27+
jsonb, err := json.Marshal(widget)
28+
t.Must(t.Nil(err))
29+
buf := bytes.NewBuffer(jsonb)
30+
31+
resp, err := http.Post(server.URL+"/widgets", "application/json", buf)
32+
t.Must(t.Nil(err))
33+
34+
t.Must(t.Equal(resp.StatusCode, http.StatusOK))
35+
36+
// b, err := ioutil.ReadAll(resp.Body)
37+
// resp.Body.Close()
38+
// t.Must(t.Nil(err))
39+
// TODO: finish test
40+
}
41+
42+
func (t *mainSuite) TestHandleGetWidget() {
43+
resp, err := http.Get(server.URL + "/widgets/mywidget")
44+
t.Must(t.Nil(err))
45+
46+
t.Must(t.Equal(resp.StatusCode, http.StatusOK))
47+
48+
// b, err := ioutil.ReadAll(resp.Body)
49+
// resp.Body.Close()
50+
// t.Must(t.Nil(err))
51+
// TODO: finish test
52+
}

Diff for: test/urlparameters.go

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package test
2+
3+
import "regexp"
4+
5+
// Three general formats for URL params
6+
// in common go routing packages:
7+
// 1. "/hello/:name" - httprouter, martini, goji, traffic
8+
// 2. "/hello/{name}" - gorilla/mux
9+
// 3. "/hello/#name" - go-json-rest
10+
11+
const (
12+
curlyBracePattern = `/\{([^\}]+)\}`
13+
// colonPattern = ...
14+
// hashPattern = ...
15+
)
16+
17+
var (
18+
CurlyBraceMatcher = regexp.MustCompile(curlyBracePattern)
19+
)

0 commit comments

Comments
 (0)