mirror of
				https://github.com/lingble/chatwoot.git
				synced 2025-11-03 20:48:07 +00:00 
			
		
		
		
	# Pull Request Template ## Description This PR includes a translation update for the "None" option in the automation select for both agents and teams ## Type of change - [x] Bug fix (non-breaking change which fixes an issue) ## Checklist: - [x] My code follows the style guidelines of this project - [x] I have performed a self-review of my code - [x] I have commented on my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [x] I have added tests that prove my fix is effective or that my feature works - [x] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules
		
			
				
	
	
		
			456 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			456 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
import * as helpers from 'dashboard/helper/automationHelper';
 | 
						|
import {
 | 
						|
  OPERATOR_TYPES_1,
 | 
						|
  OPERATOR_TYPES_3,
 | 
						|
  OPERATOR_TYPES_4,
 | 
						|
} from 'dashboard/routes/dashboard/settings/automation/operators';
 | 
						|
import {
 | 
						|
  customAttributes,
 | 
						|
  labels,
 | 
						|
  automation,
 | 
						|
  contactAttrs,
 | 
						|
  conversationAttrs,
 | 
						|
  expectedOutputForCustomAttributeGenerator,
 | 
						|
} from './fixtures/automationFixtures';
 | 
						|
import { AUTOMATIONS } from 'dashboard/routes/dashboard/settings/automation/constants';
 | 
						|
 | 
						|
describe('getCustomAttributeInputType', () => {
 | 
						|
  it('returns the attribute input type', () => {
 | 
						|
    expect(helpers.getCustomAttributeInputType('date')).toEqual('date');
 | 
						|
    expect(helpers.getCustomAttributeInputType('date')).not.toEqual(
 | 
						|
      'some_random_value'
 | 
						|
    );
 | 
						|
    expect(helpers.getCustomAttributeInputType('text')).toEqual('plain_text');
 | 
						|
    expect(helpers.getCustomAttributeInputType('list')).toEqual(
 | 
						|
      'search_select'
 | 
						|
    );
 | 
						|
    expect(helpers.getCustomAttributeInputType('checkbox')).toEqual(
 | 
						|
      'search_select'
 | 
						|
    );
 | 
						|
    expect(helpers.getCustomAttributeInputType('some_random_text')).toEqual(
 | 
						|
      'plain_text'
 | 
						|
    );
 | 
						|
  });
 | 
						|
});
 | 
						|
 | 
						|
describe('isACustomAttribute', () => {
 | 
						|
  it('returns the custom attribute value if true', () => {
 | 
						|
    expect(
 | 
						|
      helpers.isACustomAttribute(customAttributes, 'signed_up_at')
 | 
						|
    ).toBeTruthy();
 | 
						|
    expect(helpers.isACustomAttribute(customAttributes, 'status')).toBeFalsy();
 | 
						|
  });
 | 
						|
});
 | 
						|
 | 
						|
describe('getCustomAttributeListDropdownValues', () => {
 | 
						|
  it('returns the attribute dropdown values', () => {
 | 
						|
    const myListValues = [
 | 
						|
      { id: 'item1', name: 'item1' },
 | 
						|
      { id: 'item2', name: 'item2' },
 | 
						|
      { id: 'item3', name: 'item3' },
 | 
						|
    ];
 | 
						|
    expect(
 | 
						|
      helpers.getCustomAttributeListDropdownValues(customAttributes, 'my_list')
 | 
						|
    ).toEqual(myListValues);
 | 
						|
  });
 | 
						|
});
 | 
						|
 | 
						|
describe('isCustomAttributeCheckbox', () => {
 | 
						|
  it('checks if attribute is a checkbox', () => {
 | 
						|
    expect(
 | 
						|
      helpers.isCustomAttributeCheckbox(customAttributes, 'prime_user')
 | 
						|
        .attribute_display_type
 | 
						|
    ).toEqual('checkbox');
 | 
						|
    expect(
 | 
						|
      helpers.isCustomAttributeCheckbox(customAttributes, 'my_check')
 | 
						|
        .attribute_display_type
 | 
						|
    ).toEqual('checkbox');
 | 
						|
    expect(
 | 
						|
      helpers.isCustomAttributeCheckbox(customAttributes, 'my_list')
 | 
						|
    ).not.toEqual('checkbox');
 | 
						|
  });
 | 
						|
});
 | 
						|
 | 
						|
describe('isCustomAttributeList', () => {
 | 
						|
  it('checks if attribute is a list', () => {
 | 
						|
    expect(
 | 
						|
      helpers.isCustomAttributeList(customAttributes, 'my_list')
 | 
						|
        .attribute_display_type
 | 
						|
    ).toEqual('list');
 | 
						|
  });
 | 
						|
});
 | 
						|
 | 
						|
describe('getOperatorTypes', () => {
 | 
						|
  it('returns the correct custom attribute operators', () => {
 | 
						|
    expect(helpers.getOperatorTypes('list')).toEqual(OPERATOR_TYPES_1);
 | 
						|
    expect(helpers.getOperatorTypes('text')).toEqual(OPERATOR_TYPES_3);
 | 
						|
    expect(helpers.getOperatorTypes('number')).toEqual(OPERATOR_TYPES_1);
 | 
						|
    expect(helpers.getOperatorTypes('link')).toEqual(OPERATOR_TYPES_1);
 | 
						|
    expect(helpers.getOperatorTypes('date')).toEqual(OPERATOR_TYPES_4);
 | 
						|
    expect(helpers.getOperatorTypes('checkbox')).toEqual(OPERATOR_TYPES_1);
 | 
						|
    expect(helpers.getOperatorTypes('some_random')).toEqual(OPERATOR_TYPES_1);
 | 
						|
  });
 | 
						|
});
 | 
						|
 | 
						|
describe('generateConditionOptions', () => {
 | 
						|
  it('returns expected conditions options array', () => {
 | 
						|
    const testConditions = [
 | 
						|
      { id: 123, title: 'Fayaz', email: 'test@test.com' },
 | 
						|
      { title: 'John', id: 324, email: 'test@john.com' },
 | 
						|
    ];
 | 
						|
    const expectedConditions = [
 | 
						|
      { id: 123, name: 'Fayaz' },
 | 
						|
      { id: 324, name: 'John' },
 | 
						|
    ];
 | 
						|
    expect(helpers.generateConditionOptions(testConditions)).toEqual(
 | 
						|
      expectedConditions
 | 
						|
    );
 | 
						|
  });
 | 
						|
});
 | 
						|
 | 
						|
describe('getActionOptions', () => {
 | 
						|
  it('returns expected actions options array', () => {
 | 
						|
    const expectedOptions = [
 | 
						|
      { id: 'testlabel', name: 'testlabel' },
 | 
						|
      { id: 'snoozes', name: 'snoozes' },
 | 
						|
    ];
 | 
						|
    expect(helpers.getActionOptions({ labels, type: 'add_label' })).toEqual(
 | 
						|
      expectedOptions
 | 
						|
    );
 | 
						|
  });
 | 
						|
 | 
						|
  it('adds None option when addNoneToListFn is provided', () => {
 | 
						|
    const mockAddNoneToListFn = list => [
 | 
						|
      { id: 'nil', name: 'None' },
 | 
						|
      ...(list || []),
 | 
						|
    ];
 | 
						|
 | 
						|
    const agents = [
 | 
						|
      { id: 1, name: 'Agent 1' },
 | 
						|
      { id: 2, name: 'Agent 2' },
 | 
						|
    ];
 | 
						|
 | 
						|
    const expectedOptions = [
 | 
						|
      { id: 'nil', name: 'None' },
 | 
						|
      { id: 1, name: 'Agent 1' },
 | 
						|
      { id: 2, name: 'Agent 2' },
 | 
						|
    ];
 | 
						|
 | 
						|
    expect(
 | 
						|
      helpers.getActionOptions({
 | 
						|
        agents,
 | 
						|
        type: 'assign_agent',
 | 
						|
        addNoneToListFn: mockAddNoneToListFn,
 | 
						|
      })
 | 
						|
    ).toEqual(expectedOptions);
 | 
						|
  });
 | 
						|
 | 
						|
  it('does not add None option when addNoneToListFn is not provided', () => {
 | 
						|
    const agents = [
 | 
						|
      { id: 1, name: 'Agent 1' },
 | 
						|
      { id: 2, name: 'Agent 2' },
 | 
						|
    ];
 | 
						|
 | 
						|
    expect(
 | 
						|
      helpers.getActionOptions({
 | 
						|
        agents,
 | 
						|
        type: 'assign_agent',
 | 
						|
      })
 | 
						|
    ).toEqual(agents);
 | 
						|
  });
 | 
						|
});
 | 
						|
 | 
						|
describe('getConditionOptions', () => {
 | 
						|
  it('returns expected conditions options', () => {
 | 
						|
    const testOptions = [
 | 
						|
      { id: 'open', name: 'Open' },
 | 
						|
      { id: 'resolved', name: 'Resolved' },
 | 
						|
      { id: 'pending', name: 'Pending' },
 | 
						|
      { id: 'snoozed', name: 'Snoozed' },
 | 
						|
      { id: 'all', name: 'All' },
 | 
						|
    ];
 | 
						|
    expect(
 | 
						|
      helpers.getConditionOptions({
 | 
						|
        customAttributes,
 | 
						|
        campaigns: [],
 | 
						|
        statusFilterOptions: testOptions,
 | 
						|
        type: 'status',
 | 
						|
      })
 | 
						|
    ).toEqual(testOptions);
 | 
						|
  });
 | 
						|
});
 | 
						|
 | 
						|
describe('getFileName', () => {
 | 
						|
  it('returns the correct file name', () => {
 | 
						|
    expect(
 | 
						|
      helpers.getFileName(automation.actions[0], automation.files)
 | 
						|
    ).toEqual('pfp.jpeg');
 | 
						|
  });
 | 
						|
});
 | 
						|
 | 
						|
describe('getDefaultConditions', () => {
 | 
						|
  it('returns the resp default condition model', () => {
 | 
						|
    const messageCreatedModel = [
 | 
						|
      {
 | 
						|
        attribute_key: 'message_type',
 | 
						|
        filter_operator: 'equal_to',
 | 
						|
        values: '',
 | 
						|
        query_operator: 'and',
 | 
						|
        custom_attribute_type: '',
 | 
						|
      },
 | 
						|
    ];
 | 
						|
    const genericConditionModel = [
 | 
						|
      {
 | 
						|
        attribute_key: 'status',
 | 
						|
        filter_operator: 'equal_to',
 | 
						|
        values: '',
 | 
						|
        query_operator: 'and',
 | 
						|
        custom_attribute_type: '',
 | 
						|
      },
 | 
						|
    ];
 | 
						|
    expect(helpers.getDefaultConditions('message_created')).toEqual(
 | 
						|
      messageCreatedModel
 | 
						|
    );
 | 
						|
    expect(helpers.getDefaultConditions()).toEqual(genericConditionModel);
 | 
						|
  });
 | 
						|
});
 | 
						|
 | 
						|
describe('getDefaultActions', () => {
 | 
						|
  it('returns the resp default action model', () => {
 | 
						|
    const genericActionModel = [
 | 
						|
      {
 | 
						|
        action_name: 'assign_agent',
 | 
						|
        action_params: [],
 | 
						|
      },
 | 
						|
    ];
 | 
						|
    expect(helpers.getDefaultActions()).toEqual(genericActionModel);
 | 
						|
  });
 | 
						|
});
 | 
						|
 | 
						|
describe('filterCustomAttributes', () => {
 | 
						|
  it('filters the raw custom attributes', () => {
 | 
						|
    const filteredAttributes = [
 | 
						|
      { key: 'signed_up_at', name: 'Signed Up At', type: 'date' },
 | 
						|
      { key: 'prime_user', name: 'Prime User', type: 'checkbox' },
 | 
						|
      { key: 'test', name: 'Test', type: 'text' },
 | 
						|
      { key: 'link', name: 'Link', type: 'link' },
 | 
						|
      { key: 'my_list', name: 'My List', type: 'list' },
 | 
						|
      { key: 'my_check', name: 'My Check', type: 'checkbox' },
 | 
						|
      { key: 'conlist', name: 'ConList', type: 'list' },
 | 
						|
      { key: 'asdf', name: 'asdf', type: 'link' },
 | 
						|
    ];
 | 
						|
    expect(helpers.filterCustomAttributes(customAttributes)).toEqual(
 | 
						|
      filteredAttributes
 | 
						|
    );
 | 
						|
  });
 | 
						|
});
 | 
						|
 | 
						|
describe('getStandardAttributeInputType', () => {
 | 
						|
  it('returns the resp default action model', () => {
 | 
						|
    expect(
 | 
						|
      helpers.getStandardAttributeInputType(
 | 
						|
        AUTOMATIONS,
 | 
						|
        'message_created',
 | 
						|
        'message_type'
 | 
						|
      )
 | 
						|
    ).toEqual('search_select');
 | 
						|
    expect(
 | 
						|
      helpers.getStandardAttributeInputType(
 | 
						|
        AUTOMATIONS,
 | 
						|
        'conversation_created',
 | 
						|
        'status'
 | 
						|
      )
 | 
						|
    ).toEqual('multi_select');
 | 
						|
    expect(
 | 
						|
      helpers.getStandardAttributeInputType(
 | 
						|
        AUTOMATIONS,
 | 
						|
        'conversation_updated',
 | 
						|
        'referer'
 | 
						|
      )
 | 
						|
    ).toEqual('plain_text');
 | 
						|
  });
 | 
						|
});
 | 
						|
 | 
						|
describe('generateAutomationPayload', () => {
 | 
						|
  it('returns the resp default action model', () => {
 | 
						|
    const testPayload = {
 | 
						|
      name: 'Test',
 | 
						|
      description: 'This is a test',
 | 
						|
      event_name: 'conversation_created',
 | 
						|
      conditions: [
 | 
						|
        {
 | 
						|
          attribute_key: 'status',
 | 
						|
          filter_operator: 'equal_to',
 | 
						|
          values: [{ id: 'open', name: 'Open' }],
 | 
						|
          query_operator: 'and',
 | 
						|
        },
 | 
						|
      ],
 | 
						|
      actions: [
 | 
						|
        {
 | 
						|
          action_name: 'add_label',
 | 
						|
          action_params: [{ id: 2, name: 'testlabel' }],
 | 
						|
        },
 | 
						|
      ],
 | 
						|
    };
 | 
						|
    const expectedPayload = {
 | 
						|
      name: 'Test',
 | 
						|
      description: 'This is a test',
 | 
						|
      event_name: 'conversation_created',
 | 
						|
      conditions: [
 | 
						|
        {
 | 
						|
          attribute_key: 'status',
 | 
						|
          filter_operator: 'equal_to',
 | 
						|
          values: ['open'],
 | 
						|
        },
 | 
						|
      ],
 | 
						|
      actions: [
 | 
						|
        {
 | 
						|
          action_name: 'add_label',
 | 
						|
          action_params: [2],
 | 
						|
        },
 | 
						|
      ],
 | 
						|
    };
 | 
						|
    expect(helpers.generateAutomationPayload(testPayload)).toEqual(
 | 
						|
      expectedPayload
 | 
						|
    );
 | 
						|
  });
 | 
						|
});
 | 
						|
 | 
						|
describe('isCustomAttribute', () => {
 | 
						|
  it('returns the resp default action model', () => {
 | 
						|
    const attrs = helpers.filterCustomAttributes(customAttributes);
 | 
						|
    expect(helpers.isCustomAttribute(attrs, 'my_list')).toBeTruthy();
 | 
						|
    expect(helpers.isCustomAttribute(attrs, 'my_check')).toBeTruthy();
 | 
						|
    expect(helpers.isCustomAttribute(attrs, 'signed_up_at')).toBeTruthy();
 | 
						|
    expect(helpers.isCustomAttribute(attrs, 'link')).toBeTruthy();
 | 
						|
    expect(helpers.isCustomAttribute(attrs, 'prime_user')).toBeTruthy();
 | 
						|
    expect(helpers.isCustomAttribute(attrs, 'hello')).toBeFalsy();
 | 
						|
  });
 | 
						|
});
 | 
						|
 | 
						|
describe('generateCustomAttributes', () => {
 | 
						|
  it('generates and returns correct condition attribute', () => {
 | 
						|
    expect(
 | 
						|
      helpers.generateCustomAttributes(
 | 
						|
        conversationAttrs,
 | 
						|
        contactAttrs,
 | 
						|
        'Conversation Custom Attributes',
 | 
						|
        'Contact Custom Attributes'
 | 
						|
      )
 | 
						|
    ).toEqual(expectedOutputForCustomAttributeGenerator);
 | 
						|
  });
 | 
						|
});
 | 
						|
 | 
						|
describe('getAttributes', () => {
 | 
						|
  it('returns the conditions for the given automation type', () => {
 | 
						|
    const result = helpers.getAttributes(AUTOMATIONS, 'message_created');
 | 
						|
    expect(result).toEqual(AUTOMATIONS.message_created.conditions);
 | 
						|
  });
 | 
						|
});
 | 
						|
 | 
						|
describe('getAttributes', () => {
 | 
						|
  it('returns the conditions for the given automation type', () => {
 | 
						|
    const result = helpers.getAttributes(AUTOMATIONS, 'message_created');
 | 
						|
    expect(result).toEqual(AUTOMATIONS.message_created.conditions);
 | 
						|
  });
 | 
						|
});
 | 
						|
 | 
						|
describe('getAutomationType', () => {
 | 
						|
  it('returns the automation type for the given key', () => {
 | 
						|
    const mockAutomation = { event_name: 'message_created' };
 | 
						|
    const result = helpers.getAutomationType(
 | 
						|
      AUTOMATIONS,
 | 
						|
      mockAutomation,
 | 
						|
      'message_type'
 | 
						|
    );
 | 
						|
    expect(result).toEqual(
 | 
						|
      AUTOMATIONS.message_created.conditions.find(c => c.key === 'message_type')
 | 
						|
    );
 | 
						|
  });
 | 
						|
});
 | 
						|
 | 
						|
describe('getInputType', () => {
 | 
						|
  it('returns the input type for a custom attribute', () => {
 | 
						|
    const mockAutomation = { event_name: 'message_created' };
 | 
						|
    const result = helpers.getInputType(
 | 
						|
      customAttributes,
 | 
						|
      AUTOMATIONS,
 | 
						|
      mockAutomation,
 | 
						|
      'signed_up_at'
 | 
						|
    );
 | 
						|
    expect(result).toEqual('date');
 | 
						|
  });
 | 
						|
 | 
						|
  it('returns the input type for a standard attribute', () => {
 | 
						|
    const mockAutomation = { event_name: 'message_created' };
 | 
						|
    const result = helpers.getInputType(
 | 
						|
      customAttributes,
 | 
						|
      AUTOMATIONS,
 | 
						|
      mockAutomation,
 | 
						|
      'message_type'
 | 
						|
    );
 | 
						|
    expect(result).toEqual('search_select');
 | 
						|
  });
 | 
						|
});
 | 
						|
 | 
						|
describe('getOperators', () => {
 | 
						|
  it('returns operators for a custom attribute in edit mode', () => {
 | 
						|
    const mockAutomation = { event_name: 'message_created' };
 | 
						|
    const result = helpers.getOperators(
 | 
						|
      customAttributes,
 | 
						|
      AUTOMATIONS,
 | 
						|
      mockAutomation,
 | 
						|
      'edit',
 | 
						|
      'signed_up_at'
 | 
						|
    );
 | 
						|
    expect(result).toEqual(OPERATOR_TYPES_4);
 | 
						|
  });
 | 
						|
 | 
						|
  it('returns operators for a standard attribute', () => {
 | 
						|
    const mockAutomation = { event_name: 'message_created' };
 | 
						|
    const result = helpers.getOperators(
 | 
						|
      customAttributes,
 | 
						|
      AUTOMATIONS,
 | 
						|
      mockAutomation,
 | 
						|
      'create',
 | 
						|
      'message_type'
 | 
						|
    );
 | 
						|
    expect(result).toEqual(
 | 
						|
      AUTOMATIONS.message_created.conditions.find(c => c.key === 'message_type')
 | 
						|
        .filterOperators
 | 
						|
    );
 | 
						|
  });
 | 
						|
});
 | 
						|
 | 
						|
describe('getCustomAttributeType', () => {
 | 
						|
  it('returns the custom attribute type for the given key', () => {
 | 
						|
    const mockAutomation = { event_name: 'message_created' };
 | 
						|
    const result = helpers.getCustomAttributeType(
 | 
						|
      AUTOMATIONS,
 | 
						|
      mockAutomation,
 | 
						|
      'message_type'
 | 
						|
    );
 | 
						|
    expect(result).toEqual(
 | 
						|
      AUTOMATIONS.message_created.conditions.find(c => c.key === 'message_type')
 | 
						|
        .customAttributeType
 | 
						|
    );
 | 
						|
  });
 | 
						|
});
 | 
						|
 | 
						|
describe('showActionInput', () => {
 | 
						|
  it('returns false for send_email_to_team and send_message actions', () => {
 | 
						|
    expect(helpers.showActionInput([], 'send_email_to_team')).toBe(false);
 | 
						|
    expect(helpers.showActionInput([], 'send_message')).toBe(false);
 | 
						|
  });
 | 
						|
 | 
						|
  it('returns true if the action has an input type', () => {
 | 
						|
    const mockActionTypes = [{ key: 'add_label', inputType: 'select' }];
 | 
						|
    expect(helpers.showActionInput(mockActionTypes, 'add_label')).toBe(true);
 | 
						|
  });
 | 
						|
 | 
						|
  it('returns false if the action does not have an input type', () => {
 | 
						|
    const mockActionTypes = [{ key: 'some_action', inputType: null }];
 | 
						|
    expect(helpers.showActionInput(mockActionTypes, 'some_action')).toBe(false);
 | 
						|
  });
 | 
						|
});
 |