diff --git a/models/fixtures/issue_watch.yml b/models/fixtures/issue_watch.yml
new file mode 100644
index 0000000000..596662d20c
--- /dev/null
+++ b/models/fixtures/issue_watch.yml
@@ -0,0 +1,15 @@
+-
+  id: 1
+  user_id: 1
+  issue_id: 1
+  is_watching: true
+  created_unix: 946684800
+  updated_unix: 946684800
+
+-
+  id: 2
+  user_id: 2
+  issue_id: 2
+  is_watching: false
+  created_unix: 946684800
+  updated_unix: 946684800
diff --git a/models/issue_watch_test.go b/models/issue_watch_test.go
new file mode 100644
index 0000000000..5b820ded7b
--- /dev/null
+++ b/models/issue_watch_test.go
@@ -0,0 +1,42 @@
+// Copyright 2017 The Gitea Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package models
+
+import (
+	"testing"
+
+	"github.com/stretchr/testify/assert"
+)
+
+func TestCreateOrUpdateIssueWatch(t *testing.T) {
+	assert.NoError(t, PrepareTestDatabase())
+
+	assert.NoError(t, CreateOrUpdateIssueWatch(3, 1, true))
+	iw := AssertExistsAndLoadBean(t, &IssueWatch{UserID: 3, IssueID: 1}).(*IssueWatch)
+	assert.Equal(t, true, iw.IsWatching)
+
+	assert.NoError(t, CreateOrUpdateIssueWatch(1, 1, false))
+	iw = AssertExistsAndLoadBean(t, &IssueWatch{UserID: 1, IssueID: 1}).(*IssueWatch)
+	assert.Equal(t, false, iw.IsWatching)
+}
+
+func TestGetIssueWatch(t *testing.T) {
+	assert.NoError(t, PrepareTestDatabase())
+
+	_, exists, err := GetIssueWatch(1, 1)
+	assert.Equal(t, true, exists)
+	assert.NoError(t, err)
+	_, exists, err = GetIssueWatch(2, 2)
+	assert.Equal(t, true, exists)
+	assert.NoError(t, err)
+}
+
+func TestGetIssueWatchers(t *testing.T) {
+	assert.NoError(t, PrepareTestDatabase())
+
+	iws, err := GetIssueWatchers(1)
+	assert.NoError(t, err)
+	assert.Equal(t, 1, len(iws))
+}