# Redmine - project management software # Copyright (C) 2006-2009 Jean-Philippe Lang # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. require File.dirname(__FILE__) + '/../test_helper' class MessageTest < ActiveSupport::TestCase fixtures :projects, :roles, :members, :member_roles, :boards, :messages, :users, :watchers def setup @board = Board.find(1) @user = User.find(1) end def test_create topics_count = @board.topics_count messages_count = @board.messages_count message = Message.new(:board => @board, :subject => 'Test message', :content => 'Test message content', :author => @user) assert message.save @board.reload # topics count incremented assert_equal topics_count+1, @board[:topics_count] # messages count incremented assert_equal messages_count+1, @board[:messages_count] assert_equal message, @board.last_message # author should be watching the message assert message.watched_by?(@user) end def test_reply topics_count = @board.topics_count messages_count = @board.messages_count @message = Message.find(1) replies_count = @message.replies_count reply_author = User.find(2) reply = Message.new(:board => @board, :subject => 'Test reply', :content => 'Test reply content', :parent => @message, :author => reply_author) assert reply.save @board.reload # same topics count assert_equal topics_count, @board[:topics_count] # messages count incremented assert_equal messages_count+1, @board[:messages_count] assert_equal reply, @board.last_message @message.reload # replies count incremented assert_equal replies_count+1, @message[:replies_count] assert_equal reply, @message.last_reply # author should be watching the message assert @message.watched_by?(reply_author) end def test_moving_message_should_update_counters @message = Message.find(1) assert_no_difference 'Message.count' do # Previous board assert_difference 'Board.find(1).topics_count', -1 do assert_difference 'Board.find(1).messages_count', -(1 + @message.replies_count) do # New board assert_difference 'Board.find(2).topics_count' do assert_difference 'Board.find(2).messages_count', (1 + @message.replies_count) do @message.update_attributes(:board_id => 2) end end end end end end def test_destroy_topic message = Message.find(1) board = message.board topics_count, messages_count = board.topics_count, board.messages_count assert_difference('Watcher.count', -1) do assert message.destroy end board.reload # Replies deleted assert Message.find_all_by_parent_id(1).empty? # Checks counters assert_equal topics_count - 1, board.topics_count assert_equal messages_count - 3, board.messages_count # Watchers removed end def test_destroy_reply message = Message.find(5) board = message.board topics_count, messages_count = board.topics_count, board.messages_count assert message.destroy board.reload # Checks counters assert_equal topics_count, board.topics_count assert_equal messages_count - 1, board.messages_count end def test_editable_by message = Message.find(6) author = message.author assert message.editable_by?(author) author.roles_for_project(message.project).first.remove_permission!(:edit_own_messages) assert !message.reload.editable_by?(author.reload) end def test_destroyable_by message = Message.find(6) author = message.author assert message.destroyable_by?(author) author.roles_for_project(message.project).first.remove_permission!(:delete_own_messages) assert !message.reload.destroyable_by?(author.reload) end def test_set_sticky message = Message.new assert_equal 0, message.sticky message.sticky = nil assert_equal 0, message.sticky message.sticky = false assert_equal 0, message.sticky message.sticky = true assert_equal 1, message.sticky message.sticky = '0' assert_equal 0, message.sticky message.sticky = '1' assert_equal 1, message.sticky end end a id='n50' href='#n50'>50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
// 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 (
"errors"
"code.gitea.io/gitea/modules/auth/openid"
"code.gitea.io/gitea/modules/log"
)
var (
// ErrOpenIDNotExist openid is not known
ErrOpenIDNotExist = errors.New("OpenID is unknown")
)
// UserOpenID is the list of all OpenID identities of a user.
type UserOpenID struct {
ID int64 `xorm:"pk autoincr"`
UID int64 `xorm:"INDEX NOT NULL"`
URI string `xorm:"UNIQUE NOT NULL"`
Show bool `xorm:"DEFAULT false"`
}
// GetUserOpenIDs returns all openid addresses that belongs to given user.
func GetUserOpenIDs(uid int64) ([]*UserOpenID, error) {
openids := make([]*UserOpenID, 0, 5)
if err := x.
Where("uid=?", uid).
Asc("id").
Find(&openids); err != nil {
return nil, err
}
return openids, nil
}
func isOpenIDUsed(e Engine, uri string) (bool, error) {
if len(uri) == 0 {
return true, nil
}
return e.Get(&UserOpenID{URI: uri})
}
// IsOpenIDUsed returns true if the openid has been used.
func IsOpenIDUsed(openid string) (bool, error) {
return isOpenIDUsed(x, openid)
}
// NOTE: make sure openid.URI is normalized already
func addUserOpenID(e Engine, openid *UserOpenID) error {
used, err := isOpenIDUsed(e, openid.URI)
if err != nil {
return err
} else if used {
return ErrOpenIDAlreadyUsed{openid.URI}
}
_, err = e.Insert(openid)
return err
}
// AddUserOpenID adds an pre-verified/normalized OpenID URI to given user.
func AddUserOpenID(openid *UserOpenID) error {
return addUserOpenID(x, openid)
}
// DeleteUserOpenID deletes an openid address of given user.
func DeleteUserOpenID(openid *UserOpenID) (err error) {
var deleted int64
// ask to check UID
var address = UserOpenID{
UID: openid.UID,
}
if openid.ID > 0 {
deleted, err = x.ID(openid.ID).Delete(&address)
} else {
deleted, err = x.
Where("openid=?", openid.URI).
Delete(&address)
}
if err != nil {
return err
} else if deleted != 1 {
return ErrOpenIDNotExist
}
return nil
}
// ToggleUserOpenIDVisibility toggles visibility of an openid address of given user.
func ToggleUserOpenIDVisibility(id int64) (err error) {
_, err = x.Exec("update `user_open_id` set `show` = not `show` where `id` = ?", id)
return err
}
// GetUserByOpenID returns the user object by given OpenID if exists.
func GetUserByOpenID(uri string) (*User, error) {
if len(uri) == 0 {
return nil, ErrUserNotExist{0, uri, 0}
}
uri, err := openid.Normalize(uri)
if err != nil {
return nil, err
}
log.Trace("Normalized OpenID URI: " + uri)
// Otherwise, check in openid table
oid := &UserOpenID{URI: uri}
has, err := x.Get(oid)
if err != nil {
return nil, err
}
if has {
return GetUserByID(oid.UID)
}
return nil, ErrUserNotExist{0, uri, 0}
}