diff --git a/app/models/widget/card.rb b/app/models/widget/card.rb index bd5ed98ea..a07920b35 100644 --- a/app/models/widget/card.rb +++ b/app/models/widget/card.rb @@ -12,12 +12,14 @@ class Widget::Card < ApplicationRecord validates :link_url, presence: true, if: -> { !header? || link_text.present? } validates :order, numericality: { greater_than_or_equal_to: 1 } + scope :sort_by_order, -> { order(:order, :created_at) } + def self.header where(header: true) end def self.body - where(header: false, cardable_id: nil).order(:created_at) + where(header: false, cardable_id: nil).sort_by_order end def header_or_sdg_header? diff --git a/spec/models/widget/card_spec.rb b/spec/models/widget/card_spec.rb index f953fcb1e..776b7f2aa 100644 --- a/spec/models/widget/card_spec.rb +++ b/spec/models/widget/card_spec.rb @@ -86,5 +86,14 @@ describe Widget::Card do expect(Widget::Card.body).not_to include(header) expect(Widget::Card.body).not_to include(page_card) end + + it "returns cards sorted by defined order, then by 'created_at' when order is equal" do + card1 = create(:widget_card, order: 1) + card2 = create(:widget_card, order: 3) + card3 = create(:widget_card, order: 2) + card4 = create(:widget_card, order: 3) + + expect(Widget::Card.body).to eq [card1, card3, card2, card4] + end end end diff --git a/spec/system/home_spec.rb b/spec/system/home_spec.rb index 3234d9178..2efff1af1 100644 --- a/spec/system/home_spec.rb +++ b/spec/system/home_spec.rb @@ -143,6 +143,21 @@ describe "Home" do expect(page).not_to have_css(".title", text: "Featured") end + scenario "cards are first sorted by 'order' field, then by 'created_at' when order is equal" do + create(:widget_card, title: "Card one", order: 1) + create(:widget_card, title: "Card two", order: 3) + create(:widget_card, title: "Card three", order: 2) + create(:widget_card, title: "Card four", order: 3) + + visit root_path + + within(".cards-container") do + expect("CARD ONE").to appear_before("CARD THREE") + expect("CARD THREE").to appear_before("CARD TWO") + expect("CARD TWO").to appear_before("CARD FOUR") + end + end + describe "Header Card" do scenario "if there is header card with link, the link content is rendered" do create(:widget_card, :header, link_text: "Link text", link_url: "consul.dev")