Files
chatwoot/app/javascript/dashboard/store/modules/helpCenterArticles/specs/mutation.spec.js
Sivin Varghese 615a0c69fe chore: Help center improvements (#10712)
# Pull Request Template

## Description

Fixes https://linear.app/chatwoot/issue/CW-3913/issues-with-help-center

**Fixes included**
1. > The default locale that is selected should the portal default
locale.

Now, we update the last active locale in UI settings after changing the
selected locale from the article page header. This ensures that we see
the last active locale-based categories on the category page and
remember it when we return. Initially, it’s the default locale.
     
2. > I cannot switch to a different locale if there are no articles in
the portal

Now, the `v-if` condition that checked for the presence of articles in
portal has been removed. Additionally, the locale length checks for the
showing dropdown have been removed, allows locale switching even if
article is not preset.
     
3. > Create or updating the article is quite painful, see the video 

Removed the `quickSave` and `saveAndSyncDebounced` usage for a newly
creating article.

4. > I cannot see the articles if I delete the English locale
(irrespective of what I choose as default locale)

Now, the last active locale in UI settings will automatically update to
the default locale when the last active locale is deleted.

5. > Set a new default locale other than `en` and delete the `en` locale
preset in the portal. Then, adding a new locale will automatically set
`en` as the default locale, even if the `en` locale not preset in the
portal.

    Now, we pass default locale when we add a new locale.

6. Adds search for all dropdown menus
7. Update article count in realtime.


## Type of change

- [x] Bug fix (non-breaking change which fixes an issue)

## How Has This Been Tested?

**Check this linear issues**
https://linear.app/chatwoot/issue/CW-3913/issues-with-help-center


## 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
- [ ] 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

---------

Co-authored-by: Pranav <pranav@chatwoot.com>
2025-01-21 13:50:01 +05:30

158 lines
4.5 KiB
JavaScript

import { mutations } from '../mutations';
import article from './fixtures';
import types from '../../../mutation-types';
describe('#mutations', () => {
let state = {};
beforeEach(() => {
state = article;
});
describe('#SET_UI_FLAG', () => {
it('It returns default flags if empty object passed', () => {
mutations[types.SET_UI_FLAG](state, {});
expect(state.uiFlags).toEqual({
allFetched: false,
isFetching: true,
});
});
it('Update flags when flag passed as parameters', () => {
mutations[types.SET_UI_FLAG](state, { isFetching: true });
expect(state.uiFlags).toEqual({
allFetched: false,
isFetching: true,
});
});
});
describe('#ADD_ARTICLE', () => {
it('add valid article to state', () => {
mutations[types.ADD_ARTICLE](state, {
id: 3,
category_id: 1,
title:
'How do I change my registered email address and/or phone number?',
});
expect(state.articles.byId[3]).toEqual({
id: 3,
category_id: 1,
title:
'How do I change my registered email address and/or phone number?',
});
});
it('does not add article with empty data passed', () => {
mutations[types.ADD_ARTICLE](state, {});
expect(state).toEqual(article);
});
});
describe('#ARTICLES_META', () => {
beforeEach(() => {
state.meta = {};
});
it('add meta to state', () => {
mutations[types.SET_ARTICLES_META](state, {
articles_count: 3,
current_page: 1,
});
expect(state.meta).toEqual({
articles_count: 3,
current_page: 1,
});
});
it('preserves existing meta values and updates only provided keys', () => {
state.meta = {
all_articles_count: 56,
archived_articles_count: 5,
articles_count: 56,
current_page: '1',
draft_articles_count: 26,
published_count: 25,
};
mutations[types.SET_ARTICLES_META](state, {
articles_count: 3,
draft_articles_count: 27,
});
expect(state.meta).toEqual({
all_articles_count: 56,
archived_articles_count: 5,
current_page: '1',
articles_count: 3,
draft_articles_count: 27,
published_count: 25,
});
});
});
describe('#ADD_ARTICLE_ID', () => {
it('add valid article id to state', () => {
mutations[types.ADD_ARTICLE_ID](state, 3);
expect(state.articles.allIds).toEqual([1, 2, 3]);
});
it('Does not invalid article with empty data passed', () => {
mutations[types.ADD_ARTICLE_ID](state, {});
expect(state).toEqual(article);
});
});
describe('#UPDATE_ARTICLE', () => {
it('does not update if empty object is passed', () => {
mutations[types.UPDATE_ARTICLE](state, {});
expect(state).toEqual(article);
});
it('does not update if object id is not present in the state', () => {
mutations[types.UPDATE_ARTICLE](state, { id: 5 });
expect(state).toEqual(article);
});
it('updates if object with id is already present in the state', () => {
const updatedArticle = {
id: 2,
title: 'Updated Title',
content: 'Updated Content',
};
mutations[types.UPDATE_ARTICLE](state, updatedArticle);
expect(state.articles.byId[2].title).toEqual('Updated Title');
expect(state.articles.byId[2].content).toEqual('Updated Content');
});
it('preserves the original position when updating an article', () => {
const originalPosition = state.articles.byId[2].position;
const updatedArticle = {
id: 2,
title: 'Updated Title',
content: 'Updated Content',
};
mutations[types.UPDATE_ARTICLE](state, updatedArticle);
expect(state.articles.byId[2].position).toEqual(originalPosition);
});
});
describe('#REMOVE_ARTICLE', () => {
it('does not remove object entry if no id is passed', () => {
mutations[types.REMOVE_ARTICLE](state, undefined);
expect(state).toEqual({ ...article });
});
it('removes article if valid article id passed', () => {
mutations[types.REMOVE_ARTICLE](state, 2);
expect(state.articles.byId[2]).toEqual(undefined);
});
});
describe('#CLEAR_ARTICLES', () => {
it('clears articles', () => {
mutations[types.CLEAR_ARTICLES](state);
expect(state.articles.allIds).toEqual([]);
expect(state.articles.byId).toEqual({});
expect(state.articles.uiFlags).toEqual({
byId: {},
});
});
});
});