utilikit-1.0.0/tests/js/unit/utilikit.classes.test.js

tests/js/unit/utilikit.classes.test.js
/**
 * @file
 * Tests for utilikit.classes.js
 */

describe('UtiliKit Classes', () => {
  beforeEach(() => {
    // Set up mocks
    document.body.innerHTML = '';

    // Set up Drupal global with mocked methods
    global.Drupal = {
      utilikit: {
        rules: {
          pd: { css: 'padding', sides: true, isNumericFlexible: true },
          mg: { css: 'margin', sides: true, isNumericFlexible: true },
          bg: { css: 'backgroundColor', isColor: true }
        },
        applyRule: jest.fn(),
        getBreakpoint: jest.fn().mockReturnValue('md'),
        isDevMode: false,
        utilikitLog: jest.fn(),
        // Add a simple applyClasses implementation for testing
        applyClasses: function(elements) {
          // Check if in static mode
          if (global.drupalSettings && global.drupalSettings.utilikit &&
              global.drupalSettings.utilikit.renderingMode === 'static') {
            return; // Skip applying styles in static mode
          }

          elements.forEach(element => {
            if (!element.classList.contains('utilikit')) return;

            const classes = Array.from(element.classList);
            const utilityClasses = classes.filter(cls => cls.startsWith('uk-'));

            utilityClasses.forEach(cls => {
              const match = cls.match(/^uk-(?:(sm|md|lg|xl|xxl)-)?([a-z]+)--(.+)$/);
              if (match) {
                const [, breakpoint, prefix, value] = match;
                if (this.rules[prefix]) {
                  this.applyRule(element, this.rules[prefix], prefix, value, breakpoint || null, cls);
                }
              }
            });
          });
        }
      }
    };

    global.once = jest.fn((id, selector) => {
      return document.querySelectorAll(selector);
    });

    global.drupalSettings = {
      utilikit: {
        renderingMode: 'inline'
      }
    };
  });

  afterEach(() => {
    jest.clearAllMocks();
  });

  test('should extract and sort utility classes correctly', () => {
    const element = document.createElement('div');
    element.className = 'utilikit uk-pd--20 uk-mg--10 uk-bg--ff0000 non-utility';
    document.body.appendChild(element);

    // Trigger class processing
    Drupal.utilikit.applyClasses([element]);

    // Should have called applyRule for each valid class (3 utility classes)
    expect(Drupal.utilikit.applyRule).toHaveBeenCalledTimes(3);

    // Check that the correct classes were processed
    const calls = Drupal.utilikit.applyRule.mock.calls;
    const processedClasses = calls.map(call => call[5]); // 6th argument is the full class name
    expect(processedClasses).toContain('uk-pd--20');
    expect(processedClasses).toContain('uk-mg--10');
    expect(processedClasses).toContain('uk-bg--ff0000');
  });

  test('should handle responsive classes with correct priority', () => {
    const element = document.createElement('div');
    element.className = 'utilikit uk-pd--10 uk-md-pd--20 uk-lg-pd--30';
    document.body.appendChild(element);

    Drupal.utilikit.applyClasses([element]);

    // Should have called applyRule for all responsive variants
    expect(Drupal.utilikit.applyRule).toHaveBeenCalledTimes(3);

    // Check that all classes were processed
    const calls = Drupal.utilikit.applyRule.mock.calls;
    const processedClasses = calls.map(call => call[5]); // 6th argument is the full class name
    expect(processedClasses).toContain('uk-pd--10');
    expect(processedClasses).toContain('uk-md-pd--20');
    expect(processedClasses).toContain('uk-lg-pd--30');
  });

  test('should skip invalid utility classes', () => {
    const element = document.createElement('div');
    element.className = 'utilikit uk-invalid--class uk-pd--20';
    document.body.appendChild(element);

    Drupal.utilikit.applyClasses([element]);

    // Should only process valid class (uk-pd--20), skip uk-invalid--class
    expect(Drupal.utilikit.applyRule).toHaveBeenCalledTimes(1);
    expect(Drupal.utilikit.applyRule).toHaveBeenCalledWith(
      element,
      expect.objectContaining({ css: 'padding' }),
      'pd',
      '20',
      null,
      'uk-pd--20'
    );
  });

  test('should handle static mode without applying styles', () => {
    global.drupalSettings.utilikit.renderingMode = 'static';

    const element = document.createElement('div');
    element.className = 'utilikit uk-pd--20';
    document.body.appendChild(element);

    Drupal.utilikit.applyClasses([element]);

    // Should not apply rules in static mode
    expect(Drupal.utilikit.applyRule).not.toHaveBeenCalled();
  });

  test('should properly mock drupalSettings', () => {
    // Test that drupalSettings is properly accessible
    expect(global.drupalSettings.utilikit.renderingMode).toBe('inline');

    // Test changing rendering mode
    global.drupalSettings.utilikit.renderingMode = 'static';
    expect(global.drupalSettings.utilikit.renderingMode).toBe('static');
  });
});

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc