From fa2a513c62910c133316472247121c5c562eaf60 Mon Sep 17 00:00:00 2001 From: Bo-Yi Wu Date: Thu, 20 Apr 2017 10:31:31 +0800 Subject: [PATCH] feat: add download count field and unit testing for attachment. (#1512) * feat: add download count field and unit testing. * fix: unit testing * refactor: improve testing. * fix: update comment * add default value. Signed-off-by: Bo-Yi Wu --- cmd/web.go | 5 +++ models/attachment.go | 31 ++++++++++----- models/attachment_test.go | 60 ++++++++++++++++++++++++++++ models/fixtures/attachment.yml | 71 ++++++++++++++++++++++++++++++++++ 4 files changed, 158 insertions(+), 9 deletions(-) create mode 100644 models/attachment_test.go create mode 100644 models/fixtures/attachment.yml diff --git a/cmd/web.go b/cmd/web.go index a4d798d16..6b7ec321d 100644 --- a/cmd/web.go +++ b/cmd/web.go @@ -351,6 +351,11 @@ func runWeb(ctx *cli.Context) error { } defer fr.Close() + if err := attach.IncreaseDownloadCount(); err != nil { + ctx.Handle(500, "Update", err) + return + } + if err = repo.ServeData(ctx, attach.Name, fr); err != nil { ctx.Handle(500, "ServeData", err) return diff --git a/models/attachment.go b/models/attachment.go index 5fd90bef1..d800a4710 100644 --- a/models/attachment.go +++ b/models/attachment.go @@ -20,15 +20,15 @@ import ( // Attachment represent a attachment of issue/comment/release. type Attachment struct { - ID int64 `xorm:"pk autoincr"` - UUID string `xorm:"uuid UNIQUE"` - IssueID int64 `xorm:"INDEX"` - CommentID int64 - ReleaseID int64 `xorm:"INDEX"` - Name string - - Created time.Time `xorm:"-"` - CreatedUnix int64 + ID int64 `xorm:"pk autoincr"` + UUID string `xorm:"uuid UNIQUE"` + IssueID int64 `xorm:"INDEX"` + ReleaseID int64 `xorm:"INDEX"` + CommentID int64 + Name string + DownloadCount int64 `xorm:"DEFAULT 0"` + Created time.Time `xorm:"-"` + CreatedUnix int64 } // BeforeInsert is invoked from XORM before inserting an object of this type. @@ -45,6 +45,19 @@ func (a *Attachment) AfterSet(colName string, _ xorm.Cell) { } } +// IncreaseDownloadCount is update download count + 1 +func (a *Attachment) IncreaseDownloadCount() error { + sess := x.NewSession() + defer sessionRelease(sess) + + // Update download count. + if _, err := sess.Exec("UPDATE `attachment` SET download_count=download_count+1 WHERE id=?", a.ID); err != nil { + return fmt.Errorf("increase attachment count: %v", err) + } + + return nil +} + // AttachmentLocalPath returns where attachment is stored in local file // system based on given UUID. func AttachmentLocalPath(uuid string) string { diff --git a/models/attachment_test.go b/models/attachment_test.go new file mode 100644 index 000000000..5fdac31b4 --- /dev/null +++ b/models/attachment_test.go @@ -0,0 +1,60 @@ +// 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 TestIncreaseDownloadCount(t *testing.T) { + assert.NoError(t, PrepareTestDatabase()) + + attachment, err := GetAttachmentByUUID("1234567890") + assert.NoError(t, err) + assert.Equal(t, int64(0), attachment.DownloadCount) + + // increase download count + err = attachment.IncreaseDownloadCount() + assert.NoError(t, err) + + attachment, err = GetAttachmentByUUID("1234567890") + assert.NoError(t, err) + assert.Equal(t, int64(1), attachment.DownloadCount) +} + +func TestGetByCommentOrIssueID(t *testing.T) { + assert.NoError(t, PrepareTestDatabase()) + + // count of attachments from issue ID + attachments, err := GetAttachmentsByIssueID(1) + assert.NoError(t, err) + assert.Equal(t, 2, len(attachments)) + + attachments, err = GetAttachmentsByCommentID(1) + assert.NoError(t, err) + assert.Equal(t, 2, len(attachments)) +} + +func TestDeleteAttachments(t *testing.T) { + assert.NoError(t, PrepareTestDatabase()) + + count, err := DeleteAttachmentsByIssue(4, false) + assert.NoError(t, err) + assert.Equal(t, 1, count) + + count, err = DeleteAttachmentsByComment(2, false) + assert.NoError(t, err) + assert.Equal(t, 2, count) + + err = DeleteAttachment(&Attachment{ID: 8}, false) + assert.NoError(t, err) + + attachment, err := GetAttachmentByUUID("test-12345") + assert.Error(t, err) + assert.True(t, IsErrAttachmentNotExist(err)) + assert.Nil(t, attachment) +} diff --git a/models/fixtures/attachment.yml b/models/fixtures/attachment.yml new file mode 100644 index 000000000..99bd5453e --- /dev/null +++ b/models/fixtures/attachment.yml @@ -0,0 +1,71 @@ +- + id: 1 + uuid: 1234567890 + issue_id: 1 + comment_id: 0 + name: attach1 + download_count: 0 + created_unix: 946684800 + +- + id: 2 + uuid: 1122334455 + issue_id: 1 + comment_id: 0 + name: attach2 + download_count: 1 + created_unix: 946684800 + +- + id: 3 + uuid: comment-id-1 + issue_id: 2 + comment_id: 1 + name: attach1 + download_count: 0 + created_unix: 946684800 + +- + id: 4 + uuid: comment-id-2 + issue_id: 3 + comment_id: 1 + name: attach2 + download_count: 1 + created_unix: 946684800 + +- + id: 5 + uuid: comment-id-3 + issue_id: 4 + comment_id: 0 + name: attach1 + download_count: 0 + created_unix: 946684800 + +- + id: 6 + uuid: comment-id-4 + issue_id: 5 + comment_id: 2 + name: attach1 + download_count: 0 + created_unix: 946684800 + +- + id: 7 + uuid: comment-id-5 + issue_id: 5 + comment_id: 2 + name: attach1 + download_count: 0 + created_unix: 946684800 + +- + id: 8 + uuid: test-12345 + issue_id: 6 + comment_id: 0 + name: attach1 + download_count: 0 + created_unix: 946684800