/* eslint-disable ember/avoid-leaking-state-in-ember-objects */
import { module, test } from 'qunit';
import { setupTest } from 'ember-qunit';
import Service from '@ember/service';
import setupAbility from 'nomad-ui/tests/helpers/setup-ability';

module('Unit | Ability | recommendation', function (hooks) {
  setupTest(hooks);
  setupAbility('recommendation')(hooks);

  module(
    'when the Dynamic Application Sizing feature is present',
    function (hooks) {
      hooks.beforeEach(function () {
        const mockSystem = Service.extend({
          features: ['Dynamic Application Sizing'],
        });

        this.owner.register('service:system', mockSystem);
      });

      test('it permits accepting recommendations when ACLs are disabled', function (assert) {
        const mockToken = Service.extend({
          aclEnabled: false,
        });

        this.owner.register('service:token', mockToken);

        assert.ok(this.ability.canAccept);
      });

      test('it permits accepting recommendations for client tokens where any namespace has submit-job capabilities', function (assert) {
        this.owner.lookup('service:system').set('activeNamespace', {
          name: 'anotherNamespace',
        });

        const mockToken = Service.extend({
          aclEnabled: true,
          selfToken: { type: 'client' },
          selfTokenPolicies: [
            {
              rulesJSON: {
                Namespaces: [
                  {
                    Name: 'aNamespace',
                    Capabilities: [],
                  },
                  {
                    Name: 'bNamespace',
                    Capabilities: ['submit-job'],
                  },
                ],
              },
            },
          ],
        });

        this.owner.register('service:token', mockToken);

        assert.ok(this.ability.canAccept);
      });
    }
  );

  module(
    'when the Dynamic Application Sizing feature is not present',
    function (hooks) {
      hooks.beforeEach(function () {
        const mockSystem = Service.extend({
          features: [],
        });

        this.owner.register('service:system', mockSystem);
      });

      test('it does not permit accepting recommendations regardless of ACL status', function (assert) {
        const mockToken = Service.extend({
          aclEnabled: false,
        });

        this.owner.register('service:token', mockToken);

        assert.notOk(this.ability.canAccept);
      });
    }
  );
});
