require 'rails_helper'

RSpec.describe Perm, type: :model do

  context "validations" do

    it { is_expected.to validate_presence_of(:name) }

    it { is_expected.to validate_uniqueness_of(:name)
                          .with_message("must be unique") }
  end

  context "associations" do

    it { is_expected.to have_and_belong_to_many(:users) }

  end

  describe ".add_orgs" do

    subject { Perm.add_orgs }

    context "when name is 'add_orgs'" do

      let!(:perm) { create(:perm, name: "add_organisations") }

      it { is_expected.to eql(perm) }

    end

    context "when name is 'change_affiliation'" do

      let!(:perm) { create(:perm, name: "change_org_affiliation") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'grant_permissions'" do

      let!(:perm) { create(:perm, name: "grant_permissions") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'modify_templates'" do

      let!(:perm) { create(:perm, name: "modify_templates") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'modify_guidance'" do

      let!(:perm) { create(:perm, name: "modify_guidance") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'use_api'" do

      let!(:perm) { create(:perm, name: "use_api") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'change_org_details'" do

      let!(:perm) { create(:perm, name: "change_org_details") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'grant_api'" do

      let!(:perm) { create(:perm, name: "grant_api_to_orgs") }

      it { is_expected.not_to eql(perm) }

    end

  end

  describe ".change_affiliation" do

    subject { Perm.change_affiliation }

    context "when name is 'add_orgs'" do

      let!(:perm) { create(:perm, name: "add_organisations") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'change_affiliation'" do

      let!(:perm) { create(:perm, name: "change_org_affiliation") }

      it { is_expected.to eql(perm) }

    end

    context "when name is 'grant_permissions'" do

      let!(:perm) { create(:perm, name: "grant_permissions") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'modify_templates'" do

      let!(:perm) { create(:perm, name: "modify_templates") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'modify_guidance'" do

      let!(:perm) { create(:perm, name: "modify_guidance") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'use_api'" do

      let!(:perm) { create(:perm, name: "use_api") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'change_org_details'" do

      let!(:perm) { create(:perm, name: "change_org_details") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'grant_api'" do

      let!(:perm) { create(:perm, name: "grant_api_to_orgs") }

      it { is_expected.not_to eql(perm) }

    end

  end

  describe ".grant_permissions" do

    subject { Perm.grant_permissions }

    context "when name is 'add_orgs'" do

      let!(:perm) { create(:perm, name: "add_organisations") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'change_affiliation'" do

      let!(:perm) { create(:perm, name: "change_org_affiliation") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'grant_permissions'" do

      let!(:perm) { create(:perm, name: "grant_permissions") }

      it { is_expected.to eql(perm) }

    end

    context "when name is 'modify_templates'" do

      let!(:perm) { create(:perm, name: "modify_templates") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'modify_guidance'" do

      let!(:perm) { create(:perm, name: "modify_guidance") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'use_api'" do

      let!(:perm) { create(:perm, name: "use_api") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'change_org_details'" do

      let!(:perm) { create(:perm, name: "change_org_details") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'grant_api'" do

      let!(:perm) { create(:perm, name: "grant_api_to_orgs") }

      it { is_expected.not_to eql(perm) }

    end

  end

  describe ".modify_templates" do

    subject { Perm.modify_templates }

    context "when name is 'add_orgs'" do

      let!(:perm) { create(:perm, name: "add_organisations") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'change_affiliation'" do

      let!(:perm) { create(:perm, name: "change_org_affiliation") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'grant_permissions'" do

      let!(:perm) { create(:perm, name: "grant_permissions") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'modify_templates'" do

      let!(:perm) { create(:perm, name: "modify_templates") }

      it { is_expected.to eql(perm) }

    end

    context "when name is 'modify_guidance'" do

      let!(:perm) { create(:perm, name: "modify_guidance") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'use_api'" do

      let!(:perm) { create(:perm, name: "use_api") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'change_org_details'" do

      let!(:perm) { create(:perm, name: "change_org_details") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'grant_api'" do

      let!(:perm) { create(:perm, name: "grant_api_to_orgs") }

      it { is_expected.not_to eql(perm) }

    end

  end

  describe ".modify_guidance" do

    subject { Perm.modify_guidance }

    context "when name is 'add_orgs'" do

      let!(:perm) { create(:perm, name: "add_organisations") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'change_affiliation'" do

      let!(:perm) { create(:perm, name: "change_org_affiliation") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'grant_permissions'" do

      let!(:perm) { create(:perm, name: "grant_permissions") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'modify_templates'" do

      let!(:perm) { create(:perm, name: "modify_templates") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'modify_guidance'" do

      let!(:perm) { create(:perm, name: "modify_guidance") }

      it { is_expected.to eql(perm) }

    end

    context "when name is 'use_api'" do

      let!(:perm) { create(:perm, name: "use_api") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'change_org_details'" do

      let!(:perm) { create(:perm, name: "change_org_details") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'grant_api'" do

      let!(:perm) { create(:perm, name: "grant_api_to_orgs") }

      it { is_expected.not_to eql(perm) }

    end

  end

  describe ".use_api" do

    subject { Perm.use_api }

    context "when name is 'add_orgs'" do

      let!(:perm) { create(:perm, name: "add_organisations") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'change_affiliation'" do

      let!(:perm) { create(:perm, name: "change_org_affiliation") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'grant_permissions'" do

      let!(:perm) { create(:perm, name: "grant_permissions") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'modify_templates'" do

      let!(:perm) { create(:perm, name: "modify_templates") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'modify_guidance'" do

      let!(:perm) { create(:perm, name: "modify_guidance") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'use_api'" do

      let!(:perm) { create(:perm, name: "use_api") }

      it { is_expected.to eql(perm) }

    end

    context "when name is 'change_org_details'" do

      let!(:perm) { create(:perm, name: "change_org_details") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'grant_api'" do

      let!(:perm) { create(:perm, name: "grant_api_to_orgs") }

      it { is_expected.not_to eql(perm) }

    end

  end

  describe ".change_org_details" do

    subject { Perm.change_org_details }

    context "when name is 'add_orgs'" do

      let!(:perm) { create(:perm, name: "add_organisations") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'change_affiliation'" do

      let!(:perm) { create(:perm, name: "change_org_affiliation") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'grant_permissions'" do

      let!(:perm) { create(:perm, name: "grant_permissions") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'modify_templates'" do

      let!(:perm) { create(:perm, name: "modify_templates") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'modify_guidance'" do

      let!(:perm) { create(:perm, name: "modify_guidance") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'use_api'" do

      let!(:perm) { create(:perm, name: "use_api") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'change_org_details'" do

      let!(:perm) { create(:perm, name: "change_org_details") }

      it { is_expected.to eql(perm) }

    end

    context "when name is 'grant_api'" do

      let!(:perm) { create(:perm, name: "grant_api") }

      it { is_expected.not_to eql(perm) }

    end

  end

  describe ".grant_api" do

    subject { Perm.grant_api }

    context "when name is 'add_orgs'" do

      let!(:perm) { create(:perm, name: "add_organisations") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'change_affiliation'" do

      let!(:perm) { create(:perm, name: "change_org_affiliation") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'grant_permissions'" do

      let!(:perm) { create(:perm, name: "grant_permissions") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'modify_templates'" do

      let!(:perm) { create(:perm, name: "modify_templates") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'modify_guidance'" do

      let!(:perm) { create(:perm, name: "modify_guidance") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'use_api'" do

      let!(:perm) { create(:perm, name: "use_api") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'change_org_details'" do

      let!(:perm) { create(:perm, name: "change_org_details") }

      it { is_expected.not_to eql(perm) }

    end

    context "when name is 'grant_api'" do

      let!(:perm) { create(:perm, name: "grant_api_to_orgs") }

      it { is_expected.to eql(perm) }

    end
  end

end
