1package aetest
2
3import (
4	"os"
5	"testing"
6
7	"google.golang.org/appengine"
8	"google.golang.org/appengine/datastore"
9	"google.golang.org/appengine/internal"
10	"google.golang.org/appengine/memcache"
11	"google.golang.org/appengine/user"
12)
13
14func TestBasicAPICalls(t *testing.T) {
15	// Only run the test if APPENGINE_DEV_APPSERVER is explicitly set.
16	if os.Getenv("APPENGINE_DEV_APPSERVER") == "" {
17		t.Skip("APPENGINE_DEV_APPSERVER not set")
18	}
19	resetEnv := internal.SetTestEnv()
20	defer resetEnv()
21
22	inst, err := NewInstance(nil)
23	if err != nil {
24		t.Fatalf("NewInstance: %v", err)
25	}
26	defer inst.Close()
27
28	req, err := inst.NewRequest("GET", "http://example.com/page", nil)
29	if err != nil {
30		t.Fatalf("NewRequest: %v", err)
31	}
32	ctx := appengine.NewContext(req)
33
34	it := &memcache.Item{
35		Key:   "some-key",
36		Value: []byte("some-value"),
37	}
38	err = memcache.Set(ctx, it)
39	if err != nil {
40		t.Fatalf("Set err: %v", err)
41	}
42	it, err = memcache.Get(ctx, "some-key")
43	if err != nil {
44		t.Fatalf("Get err: %v; want no error", err)
45	}
46	if g, w := string(it.Value), "some-value"; g != w {
47		t.Errorf("retrieved Item.Value = %q, want %q", g, w)
48	}
49
50	type Entity struct{ Value string }
51	e := &Entity{Value: "foo"}
52	k := datastore.NewIncompleteKey(ctx, "Entity", nil)
53	k, err = datastore.Put(ctx, k, e)
54	if err != nil {
55		t.Fatalf("datastore.Put: %v", err)
56	}
57	e = new(Entity)
58	if err := datastore.Get(ctx, k, e); err != nil {
59		t.Fatalf("datastore.Get: %v", err)
60	}
61	if g, w := e.Value, "foo"; g != w {
62		t.Errorf("retrieved Entity.Value = %q, want %q", g, w)
63	}
64}
65
66func TestContext(t *testing.T) {
67	// Only run the test if APPENGINE_DEV_APPSERVER is explicitly set.
68	if os.Getenv("APPENGINE_DEV_APPSERVER") == "" {
69		t.Skip("APPENGINE_DEV_APPSERVER not set")
70	}
71
72	// Check that the context methods work.
73	_, done, err := NewContext()
74	if err != nil {
75		t.Fatalf("NewContext: %v", err)
76	}
77	done()
78}
79
80func TestUsers(t *testing.T) {
81	// Only run the test if APPENGINE_DEV_APPSERVER is explicitly set.
82	if os.Getenv("APPENGINE_DEV_APPSERVER") == "" {
83		t.Skip("APPENGINE_DEV_APPSERVER not set")
84	}
85
86	inst, err := NewInstance(nil)
87	if err != nil {
88		t.Fatalf("NewInstance: %v", err)
89	}
90	defer inst.Close()
91
92	req, err := inst.NewRequest("GET", "http://example.com/page", nil)
93	if err != nil {
94		t.Fatalf("NewRequest: %v", err)
95	}
96	ctx := appengine.NewContext(req)
97
98	if user := user.Current(ctx); user != nil {
99		t.Errorf("user.Current initially %v, want nil", user)
100	}
101
102	u := &user.User{
103		Email: "gopher@example.com",
104		Admin: true,
105	}
106	Login(u, req)
107
108	if got := user.Current(ctx); got.Email != u.Email {
109		t.Errorf("user.Current: %v, want %v", got, u)
110	}
111	if admin := user.IsAdmin(ctx); !admin {
112		t.Errorf("user.IsAdmin: %t, want true", admin)
113	}
114
115	Logout(req)
116	if user := user.Current(ctx); user != nil {
117		t.Errorf("user.Current after logout %v, want nil", user)
118	}
119}
120