Commit d64183e1 authored by Kamil Trzcinski's avatar Kamil Trzcinski

Add most of specs for chat names

parent c6043778
module ChatNames module ChatNames
class RequestService class AuthorizeUserService
include Gitlab::Routing.url_helpers include Gitlab::Routing.url_helpers
def initialize(service, params) def initialize(service, params)
...@@ -8,13 +8,19 @@ module ChatNames ...@@ -8,13 +8,19 @@ module ChatNames
end end
def execute def execute
token = chat_name_token.store!(chat_name_params) return unless chat_name_params.values.all?(&:present?)
token = request_token
new_profile_chat_name_url(token: token) if token new_profile_chat_name_url(token: token) if token
end end
private private
def request_token
chat_name_token.store!(chat_name_params)
end
def chat_name_token def chat_name_token
Gitlab::ChatNameToken.new Gitlab::ChatNameToken.new
end end
......
module ChatNames module ChatNames
class FindUserService class FindUserService
def initialize(chat_names, params) def initialize(service, params)
@chat_names = chat_names @service = service
@params = params @params = params
end end
def execute def execute
@chat_names.find_by( chat_name = find_chat_name
return unless chat_name
chat_name.update(used_at: Time.now)
chat_name.user
end
private
def find_chat_name
ChatName.find_by(
service: @service,
team_id: @params[:team_id], team_id: @params[:team_id],
chat_id: @params[:user_id] chat_id: @params[:user_id]
) )
......
- page_title "Chat" - page_title 'Chat'
= render 'profiles/head' = render 'profiles/head'
.row.prepend-top-default .row.prepend-top-default
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
%th Service %th Service
%th Team domain %th Team domain
%th Nickname %th Nickname
%th Created %th Last used
%th %th
%tbody %tbody
- @chat_names.each do |chat_name| - @chat_names.each do |chat_name|
...@@ -41,8 +41,14 @@ ...@@ -41,8 +41,14 @@
= chat_name.service.title = chat_name.service.title
%td= chat_name.team_domain %td= chat_name.team_domain
%td= chat_name.chat_name %td= chat_name.chat_name
%td= chat_name.created_at %td=
%td= link_to "Remove", profile_chat_name_path(chat_name), method: :delete, class: "btn btn-danger pull-right", data: { confirm: "Are you sure you want to revoke this nickname?" } - if chat_name.used_at
time_ago_with_tooltip(chat_name.used_at)
- else
Never
%td
= link_to 'Remove', profile_chat_name_path(chat_name), method: :delete, class: 'btn btn-danger pull-right', data: { confirm: 'Are you sure you want to revoke this nickname?' }
- else - else
.settings-message.text-center .settings-message.text-center
......
...@@ -5,13 +5,14 @@ class CreateUserChatNamesTable < ActiveRecord::Migration ...@@ -5,13 +5,14 @@ class CreateUserChatNamesTable < ActiveRecord::Migration
def change def change
create_table :chat_names do |t| create_table :chat_names do |t|
t.integer "user_id", null: false t.integer :user_id, null: false
t.integer "service_id", null: false t.integer :service_id, null: false
t.string "team_id" t.string :team_id, null: false
t.string "team_domain" t.string :team_domain
t.string "chat_id" t.string :chat_id, null: false
t.string "chat_name" t.string :chat_name
t.timestamps t.datetime :used_at
t.timestamps null: false
end end
add_index :chat_names, [:user_id, :service_id], unique: true add_index :chat_names, [:user_id, :service_id], unique: true
......
...@@ -152,15 +152,16 @@ ActiveRecord::Schema.define(version: 20161113184239) do ...@@ -152,15 +152,16 @@ ActiveRecord::Schema.define(version: 20161113184239) do
create_table "chat_names", force: :cascade do |t| create_table "chat_names", force: :cascade do |t|
t.integer "user_id", null: false t.integer "user_id", null: false
t.integer "service_id", null: false t.integer "service_id", null: false
t.string "team_id" t.string "team_id", null: false
t.string "team_domain" t.string "team_domain"
t.string "chat_id" t.string "chat_id", null: false
t.string "chat_name" t.string "chat_name"
t.datetime "created_at" t.datetime "used_at"
t.datetime "updated_at" t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end end
add_index "chat_names", ["service_id", "team_id", "user_id"], name: "index_chat_names_on_service_id_and_team_id_and_user_id", unique: true, using: :btree add_index "chat_names", ["service_id", "team_id", "chat_id"], name: "index_chat_names_on_service_id_and_team_id_and_chat_id", unique: true, using: :btree
add_index "chat_names", ["user_id", "service_id"], name: "index_chat_names_on_user_id_and_service_id", unique: true, using: :btree add_index "chat_names", ["user_id", "service_id"], name: "index_chat_names_on_user_id_and_service_id", unique: true, using: :btree
create_table "ci_application_settings", force: :cascade do |t| create_table "ci_application_settings", force: :cascade do |t|
......
...@@ -5,7 +5,7 @@ module Gitlab ...@@ -5,7 +5,7 @@ module Gitlab
attr_reader :token attr_reader :token
TOKEN_LENGTH = 50 TOKEN_LENGTH = 50
EXPIRY_TIME = 1800 EXPIRY_TIME = 10.minutes # 10 minutes
def initialize(token = new_token) def initialize(token = new_token)
@token = token @token = token
......
FactoryGirl.define do
factory :chat_name, class: ChatName do
user factory: :user
service factory: :service
team_id 'T0001'
team_domain 'Awesome Team'
sequence :chat_id do |n|
"U#{n}"
end
sequence :chat_name do |n|
"user#{n}"
end
end
end
require 'spec_helper'
describe Gitlab::ChatNameToken, lib: true do
context 'when using unknown token' do
let(:token) { }
subject { described_class.new(token).get }
it 'returns empty data' do
is_expected.to be_nil
end
end
context 'when storing data' do
let(:data) {
{ key: 'value' }
}
subject { described_class.new(@token) }
before do
@token = described_class.new.store!(data)
end
it 'returns stored data' do
expect(subject.get).to eq(data)
end
context 'and after deleting them' do
before do
subject.delete
end
it 'data are removed' do
expect(subject.get).to be_nil
end
end
end
end
require 'spec_helper'
describe ChatName, models: true do
subject { create(:chat_name) }
it { is_expected.to belong_to(:service) }
it { is_expected.to belong_to(:user) }
it { is_expected.to validate_presence_of(:user) }
it { is_expected.to validate_presence_of(:service) }
it { is_expected.to validate_presence_of(:team_id) }
it { is_expected.to validate_presence_of(:chat_id) }
it { is_expected.to validate_uniqueness_of(:user_id).scoped_to(:service_id) }
it { is_expected.to validate_uniqueness_of(:chat_id).scoped_to(:service_id, :team_id) }
end
...@@ -33,6 +33,7 @@ describe User, models: true do ...@@ -33,6 +33,7 @@ describe User, models: true do
it { is_expected.to have_many(:award_emoji).dependent(:destroy) } it { is_expected.to have_many(:award_emoji).dependent(:destroy) }
it { is_expected.to have_many(:builds).dependent(:nullify) } it { is_expected.to have_many(:builds).dependent(:nullify) }
it { is_expected.to have_many(:pipelines).dependent(:nullify) } it { is_expected.to have_many(:pipelines).dependent(:nullify) }
it { is_expected.to have_many(:chat_names).dependent(:destroy) }
describe '#group_members' do describe '#group_members' do
it 'does not include group memberships for which user is a requester' do it 'does not include group memberships for which user is a requester' do
......
require 'spec_helper'
describe ChatNames::AuthorizeUserService, services: true do
describe '#execute' do
let(:service) { create(:service) }
subject { described_class.new(service, params).execute }
context 'when all parameters are valid' do
let(:params) { { team_id: 'T0001', team_domain: 'myteam', user_id: 'U0001', user_name: 'user' } }
it 'requests a new token' do
is_expected.to include('http')
is_expected.to include('://')
is_expected.to include('token=')
end
end
context 'when there are missing parameters' do
let(:params) { { } }
it 'does not request a new token' do
is_expected.to be_nil
end
end
end
end
require 'spec_helper'
describe ChatNames::FindUserService, services: true do
describe '#execute' do
let(:service) { create(:service) }
subject { described_class.new(service, params).execute }
context 'find user mapping' do
let(:user) { create(:user) }
let!(:chat_name) { create(:chat_name, user: user, service: service) }
context 'when existing user is requested' do
let(:params) { { team_id: chat_name.team_id, user_id: chat_name.chat_id } }
it 'returns existing user' do
is_expected.to eq(user)
end
it 'updates when last time chat name was used' do
subject
expect(chat_name.reload.used_at).to be_like_time(Time.now)
end
end
context 'when different user is requested' do
let(:params) { { team_id: chat_name.team_id, user_id: 'non-existing-user' } }
it 'returns existing user' do
is_expected.to be_nil
end
end
end
end
end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment