maxiperezc/graphoid

View on GitHub
spec/graphoid/queries/attributes/sort_spec.rb

Summary

Maintainability
A
0 mins
Test Coverage
# frozen_string_literal: true

require 'rails_helper'

describe 'QuerySorted', type: :request do
  let!(:delete) { Account.delete_all }

  let!(:yesterday) { DateTime.yesterday.to_time.iso8601 }
  let!(:today)     { DateTime.now.iso8601 }
  let!(:tomorrow)  { DateTime.tomorrow.to_time.iso8601 }

  let!(:a0) { Account.create!(integer_field: 4, float_field: 4.4, string_field: 'bog', snake_case: 'snakg', camelCase: 'camog', datetime_field: today) }
  let!(:a1) { Account.create!(integer_field: 3, float_field: 4.3, string_field: 'boc', snake_case: 'snakc', camelCase: 'camoc', datetime_field: tomorrow) }
  let!(:a2) { Account.create!(integer_field: 4, float_field: 4.1, string_field: 'boa', snake_case: 'snaka', camelCase: 'camoa', datetime_field: yesterday) }
  let!(:a3) { Account.create!(integer_field: 5, float_field: 4.5, string_field: 'bod', snake_case: 'snakd', camelCase: 'camod', datetime_field: today) }
  let!(:a4) { Account.create!(integer_field: 4, float_field: 4.2, string_field: 'boe', snake_case: 'snake', camelCase: 'camee', datetime_field: today) }
  let!(:a5) { Account.create!(integer_field: 0, float_field: 4.0, string_field: 'bof', snake_case: 'snakf', camelCase: 'camef', datetime_field: tomorrow) }
  let!(:a6) { Account.create!(integer_field: 6, float_field: 4.6, string_field: 'bob', snake_case: 'snakb', camelCase: 'cameb', datetime_field: yesterday) }

  let!(:accounts) { Account.all.to_a }

  it 'sorts objects by every field' do
    (Graphoid::Attribute.fields_of(Account) - Account.graphields).each do |field|
      # TODO: array and hash sorting does not work
      next if [Array, Hash].include?(field.type)

      camelized_field = field.name.camelize.camelize(:lower).to_s

      %w[ASC DESC].each do |order|
        query = %{
          query {
            accounts(order: { #{camelized_field}: #{order} } ) {
              #{camelized_field}
            }
          }
        }

        result = Helper.resolve(self, 'accounts', query).map { |account| account[camelized_field] }
        list = accounts.map(&:"#{field.name}")
        list.map!(&:to_s) if field.type == BSON::ObjectId || field.name == 'id'
        clock_options = [:datetime, :date, :time, :timestamp, DateTime, Date, Time]

        if clock_options.include?(field.type)
          list.map! { |m| m.to_s.first(19).sub(' ', 'T') }
          result.map! { |r| r.first(19) }
        end

        list.sort!
        list.reverse! if order == 'DESC'

        expect(result).to eq(list)
      end
    end
  end

  it 'sorts by many fields' do
    query = %{
      query {
        accounts(order: { integerField: ASC, stringField: DESC } ) {
          id
          integerField
          stringField
        }
      }
    }

    result = Helper.resolve(self, 'accounts', query).map { |account| account['id'] }
    expect(result).to eq Helper.ids_of(a5, a1, a0, a4, a2, a3, a6)
  end
end