Change UserCallout feautre_name to enum

This commit is contained in:
Matija Čupić 2018-02-03 00:16:24 +01:00
parent 79efb9d0b2
commit 20714ee902
No known key found for this signature in database
GPG key ID: 4BAF84FFACD2E5DE
8 changed files with 42 additions and 22 deletions

View file

@ -1,6 +1,6 @@
class UserCalloutsController < ApplicationController
def create
if ensure_callout
if check_feature_name && ensure_callout
respond_to do |format|
format.json { head :ok }
end
@ -13,6 +13,10 @@ class UserCalloutsController < ApplicationController
private
def check_feature_name
UserCallout.feature_names.keys.include?(callout_param)
end
def ensure_callout
current_user.callouts.find_or_create_by(feature_name: callout_param)
end

View file

@ -1,11 +1,6 @@
module UserCalloutsHelper
GKE_CLUSTER_INTEGRATION = 'gke_cluster_integration'.freeze
# Higher value = higher priority
PRIORITY = {
GKE_CLUSTER_INTEGRATION: 0
}.freeze
def show_gke_cluster_integration_callout?(project)
current_user && !user_dismissed?(GKE_CLUSTER_INTEGRATION) &&
can?(current_user, :create_cluster, project)

View file

@ -1,6 +1,13 @@
class UserCallout < ActiveRecord::Base
belongs_to :user
enum feature_name: {
gke_cluster_integration: 0
}
validates :user, presence: true
validates :feature_name, presence: true, uniqueness: { scope: :user_id }
validates :feature_name,
presence: true,
uniqueness: { scope: :user_id },
inclusion: { in: UserCallout.feature_names.keys }
end

View file

@ -7,7 +7,7 @@ class CreateUserCallouts < ActiveRecord::Migration
def change
create_table :user_callouts do |t|
t.string :feature_name, null: false
t.integer :feature_name, null: false
t.references :user, index: true, foreign_key: { on_delete: :cascade }, null: false
end

View file

@ -1770,7 +1770,7 @@ ActiveRecord::Schema.define(version: 20180202111106) do
add_index "user_agent_details", ["subject_id", "subject_type"], name: "index_user_agent_details_on_subject_id_and_subject_type", using: :btree
create_table "user_callouts", force: :cascade do |t|
t.string "feature_name", null: false
t.integer "feature_name", null: false
t.integer "user_id", null: false
end

View file

@ -8,27 +8,41 @@ describe UserCalloutsController do
end
describe "POST #create" do
subject { post :create, feature_name: 'feature_name', format: :json }
subject { post :create, feature_name: feature_name, format: :json }
context 'when callout entry does not exist' do
it 'should create a callout entry with dismissed state' do
expect { subject }.to change { UserCallout.count }.by(1)
context 'with valid feature name' do
let(:feature_name) { UserCallout.feature_names.keys.first }
context 'when callout entry does not exist' do
it 'should create a callout entry with dismissed state' do
expect { subject }.to change { UserCallout.count }.by(1)
end
it 'should return success' do
subject
expect(response).to have_gitlab_http_status(:ok)
end
end
it 'should return success' do
subject
context 'when callout entry already exists' do
let!(:callout) { create(:user_callout, feature_name: UserCallout.feature_names.keys.first, user: user) }
expect(response).to have_gitlab_http_status(:ok)
it 'should return success' do
subject
expect(response).to have_gitlab_http_status(:ok)
end
end
end
context 'when callout entry already exists' do
let!(:callout) { create(:user_callout, feature_name: 'feature_name', user: user) }
context 'with invalid feature name' do
let(:feature_name) { 'bogus_feature_name' }
it 'should return success' do
it 'should return bad request' do
subject
expect(response).to have_gitlab_http_status(:ok)
expect(response).to have_gitlab_http_status(:bad_request)
end
end
end

View file

@ -1,6 +1,6 @@
FactoryBot.define do
factory :user_callout do
feature_name 'test_callout'
feature_name :gke_cluster_integration
user
end

View file

@ -11,6 +11,6 @@ describe UserCallout do
it { is_expected.to validate_presence_of(:user) }
it { is_expected.to validate_presence_of(:feature_name) }
it { is_expected.to validate_uniqueness_of(:feature_name).scoped_to(:user_id) }
it { is_expected.to validate_uniqueness_of(:feature_name).scoped_to(:user_id).ignoring_case_sensitivity }
end
end