From 28c9cfdfd4379ee13c112f84f250d9e24a883baf Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Mon, 27 Apr 2015 02:19:52 +0200 Subject: [PATCH] write cucumber test and add order_id on create --- Gemfile | 5 +++++ Gemfile.lock | 5 +++++ app/assets/javascripts/app/pages/contacts.js | 5 ++++- app/models/aspect.rb | 4 ++++ app/views/contacts/_aspect_listings.haml | 2 +- config/routes.rb | 4 +++- features/desktop/manages_aspects.feature | 10 +++++++++ features/step_definitions/aspects_steps.rb | 23 ++++++++++++++++++++ spec/models/aspect_spec.rb | 7 ++++++ 9 files changed, 62 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index ef221667f..5727347e9 100644 --- a/Gemfile +++ b/Gemfile @@ -253,6 +253,11 @@ group :test do gem "database_cleaner" , "1.4.1" gem "selenium-webdriver", "2.45.0" + source "https://rails-assets.org" do + gem "rails-assets-jquery-simulate", "1.0.1" + gem "rails-assets-jquery-simulate-ext", "1.3.0" + end + # General helpers gem "factory_girl_rails", "4.5.0" diff --git a/Gemfile.lock b/Gemfile.lock index acdb4b639..3a3e50dd6 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -500,6 +500,9 @@ GEM rails-assets-jquery-idletimer (1.0.1) rails-assets-jquery-placeholder (2.1.1) rails-assets-jquery (>= 1.6) + rails-assets-jquery-simulate (1.0.1) + rails-assets-jquery-simulate-ext (1.3.0) + rails-assets-jquery (>= 1.7.0) rails-assets-jquery-textchange (0.2.3) rails-assets-jquery rails-assets-jquery-ui (1.10.4) @@ -773,6 +776,8 @@ DEPENDENCIES rails-assets-jquery (= 1.11.1)! rails-assets-jquery-idletimer (= 1.0.1)! rails-assets-jquery-placeholder (= 2.1.1)! + rails-assets-jquery-simulate (= 1.0.1)! + rails-assets-jquery-simulate-ext (= 1.3.0)! rails-assets-jquery-textchange (= 0.2.3)! rails-assets-markdown-it (= 4.2.0)! rails-assets-markdown-it--markdown-it-for-inline (= 0.1.0)! diff --git a/app/assets/javascripts/app/pages/contacts.js b/app/assets/javascripts/app/pages/contacts.js index 9753825b6..27e7ec126 100644 --- a/app/assets/javascripts/app/pages/contacts.js +++ b/app/assets/javascripts/app/pages/contacts.js @@ -81,8 +81,11 @@ app.pages.Contacts = Backbone.View.extend({ $("#aspect_nav .nav").sortable({ items: "li.aspect[data-aspect-id]", update: function() { + $("#aspect_nav .ui-sortable").removeClass("synced"); var data = JSON.stringify({ ordered_aspect_ids: $(this).sortable("toArray", { attribute: "data-aspect-id" }) }); - $.ajax("/aspects/order", { type: "put", dataType: "text", contentType: "application/json", data: data }); + $.ajax(Routes.order_aspects_path(), + { type: "put", dataType: "text", contentType: "application/json", data: data }) + .done(function() { $("#aspect_nav .ui-sortable").addClass("synced"); }); }, revert: true, helper: "clone" diff --git a/app/models/aspect.rb b/app/models/aspect.rb index 97c812f81..dfacdc811 100644 --- a/app/models/aspect.rb +++ b/app/models/aspect.rb @@ -20,6 +20,10 @@ class Aspect < ActiveRecord::Base name.strip! end + before_create do + self.order_id ||= Aspect.where(user_id: user_id).maximum(:order_id || 0).to_i + 1 + end + def to_s name end diff --git a/app/views/contacts/_aspect_listings.haml b/app/views/contacts/_aspect_listings.haml index 2e0d98945..664b412c6 100644 --- a/app/views/contacts/_aspect_listings.haml +++ b/app/views/contacts/_aspect_listings.haml @@ -1,5 +1,5 @@ #aspect_nav - %ul.nav.nav-tabs.nav-stacked + %ul.nav.nav-tabs.nav-stacked.synced %li.all_contacts{:class => ("active" if params["set"] == "all")} %a{:href => contacts_path(:set => "all")} = t('contacts.index.all_contacts') diff --git a/config/routes.rb b/config/routes.rb index 140ae49af..997c8f77f 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -63,10 +63,12 @@ Diaspora::Application.routes.draw do get "commented" => "streams#commented", :as => "commented_stream" get "aspects" => "streams#aspects", :as => "aspects_stream" - put "aspects/order" => "aspects#update_order" resources :aspects do put :toggle_contact_visibility put :toggle_chat_privilege + collection do + put "order" => :update_order + end end get 'bookmarklet' => 'status_messages#bookmarklet' diff --git a/features/desktop/manages_aspects.feature b/features/desktop/manages_aspects.feature index 1d4f7e1df..5f6865eaf 100644 --- a/features/desktop/manages_aspects.feature +++ b/features/desktop/manages_aspects.feature @@ -75,3 +75,13 @@ Feature: User manages contacts And I click on my name in the header When I follow "Contacts" Then I should not see "Community spotlight" within ".span9" + + Scenario: sorting the aspects + Given I am signed in + And I have an aspect called "People" + And I have an aspect called "Cat People" + When I am on the contacts page + And I drag "Cat People" up 40 pixels + And I go to the contacts page + Then I should see "Cat People" as 2. aspect + And I should see "People" as 3. aspect diff --git a/features/step_definitions/aspects_steps.rb b/features/step_definitions/aspects_steps.rb index 620c56b40..5d7115066 100644 --- a/features/step_definitions/aspects_steps.rb +++ b/features/step_definitions/aspects_steps.rb @@ -88,6 +88,25 @@ When /^(.*) in the aspect creation modal$/ do |action| end end +When /^I drag "([^"]*)" (up|down) (\d+) pixels?$/ do |aspect_name, direction, distance| + distance = distance.to_i * -1 if direction == "up" + page.execute_script %{ + function drag() { + $("li.aspect:contains('#{aspect_name}')") + .simulate("drag-n-drop", { dy: #{distance}, interpolation: { stepWidth: 10, stepDelay: 5 } }); + } + function loadScripts() { + $.getScript("/assets/jquery-simulate/jquery.simulate.js", function(){ + $.getScript("/assets/jquery-simulate-ext/src/jquery.simulate.ext.js", function(){ + $.getScript("/assets/jquery-simulate-ext/src/jquery.simulate.drag-n-drop.js", drag); + }); + }); + } + if (!$.simulate) { loadScripts(); } else { drag(); } + } + expect(find("#aspect_nav")).to have_css ".synced" +end + And /^I toggle the aspect "([^"]*)"$/ do |name| toggle_aspect(name) end @@ -109,3 +128,7 @@ end Then /^the aspect dropdown should be visible$/ do aspect_dropdown_visible? end + +Then /^I should see "([^"]*)" as (\d+). aspect$/ do |aspect_name, position| + expect(find("#aspect_nav li:nth-child(#{position.to_i + 2})")).to have_text aspect_name +end diff --git a/spec/models/aspect_spec.rb b/spec/models/aspect_spec.rb index 4315345ae..4d85a2b1f 100644 --- a/spec/models/aspect_spec.rb +++ b/spec/models/aspect_spec.rb @@ -39,6 +39,13 @@ describe Aspect, :type => :model do it 'has a contacts_visible? method' do expect(alice.aspects.first.contacts_visible?).to be true end + + it "sets an order_id" do + aspect_2 = alice.aspects.create(name: "People") + expect(aspect_2.order_id).to eq(2) + aspect_3 = alice.aspects.create(name: "Cat People") + expect(aspect_3.order_id).to eq(3) + end end describe 'validation' do