Skip to content

Commit

Permalink
test(editor-reducers): add test for editor context-reducer
Browse files Browse the repository at this point in the history
Required extracting some action type definitions to separate files
to avoid pulling in code that depends on a browser environment.
  • Loading branch information
davidmason committed May 4, 2017
1 parent dc75720 commit 6dc32cd
Show file tree
Hide file tree
Showing 9 changed files with 109 additions and 41 deletions.
@@ -0,0 +1,2 @@
export const ROUTING_PARAMS_CHANGED = Symbol('ROUTING_PARAMS_CHANGED')
export const SET_SIDEBAR_VISIBILITY = Symbol('SET_SIDEBAR_VISIBILITY')
@@ -0,0 +1,10 @@
export const TOGGLE_GLOSSARY = Symbol('TOGGLE_GLOSSARY')
export const TOGGLE_HEADER = Symbol('TOGGLE_HEADER')
export const TOGGLE_KEY_SHORTCUTS = Symbol('TOGGLE_KEY_SHORTCUTS')
export const FETCH_FAILED = Symbol('FETCH_FAILED')
export const UI_LOCALES_FETCHED = Symbol('UI_LOCALES_FETCHED')
export const CHANGE_UI_LOCALE = Symbol('CHANGE_UI_LOCALE')
export const DOCUMENT_SELECTED = Symbol('DOCUMENT_SELECTED')
export const LOCALE_SELECTED = Symbol('LOCALE_SELECTED')
export const STATS_FETCHED = Symbol('STATS_FETCHED')
export const HEADER_DATA_FETCHED = Symbol('HEADER_DATA_FETCHED')
Expand Up @@ -6,33 +6,39 @@ import {
fetchDocuments,
fetchVersionLocales
} from '../api'
import {
TOGGLE_GLOSSARY,
TOGGLE_HEADER,
TOGGLE_KEY_SHORTCUTS,
FETCH_FAILED,
UI_LOCALES_FETCHED,
CHANGE_UI_LOCALE,
DOCUMENT_SELECTED,
LOCALE_SELECTED,
STATS_FETCHED,
HEADER_DATA_FETCHED
} from './header-action-types'
import { some, curry, isEmpty } from 'lodash'
import { equals } from '../utils/string-utils'

export const TOGGLE_GLOSSARY = Symbol('TOGGLE_GLOSSARY')
export function toggleGlossary () {
return {
type: TOGGLE_GLOSSARY
}
}

export const TOGGLE_HEADER = Symbol('TOGGLE_HEADER')

export function toggleHeader () {
return {
type: TOGGLE_HEADER
}
}

export const TOGGLE_KEY_SHORTCUTS = Symbol('TOGGLE_KEY_SHORTCUTS')
export function toggleKeyboardShortcutsModal () {
return {
type: TOGGLE_KEY_SHORTCUTS
}
}

export const FETCH_FAILED = Symbol('FETCH_FAILED')

const fetchFailed = (error) => {
return {type: FETCH_FAILED, error: error}
}
Expand All @@ -44,7 +50,6 @@ const unwrapResponse = (dispatch, errorMsg, response) => {
return response.json()
}

export const UI_LOCALES_FETCHED = Symbol('UI_LOCALES_FETCHED')
export function uiLocaleFetched (uiLocales) {
return {
type: UI_LOCALES_FETCHED,
Expand All @@ -63,7 +68,6 @@ export function fetchUiLocales () {
}
}

export const CHANGE_UI_LOCALE = Symbol('CHANGE_UI_LOCALE')
export function changeUiLocale (locale) {
return {
type: CHANGE_UI_LOCALE,
Expand Down Expand Up @@ -92,7 +96,6 @@ const containsLocale = (localeList, localeId) => {
return hasCaseInsensitiveMatchingProp(localeList, 'localeId', localeId)
}

export const DOCUMENT_SELECTED = Symbol('DOCUMENT_SELECTED')
export function selectDoc (docId) {
return {
type: DOCUMENT_SELECTED,
Expand All @@ -102,7 +105,6 @@ export function selectDoc (docId) {
}
}

export const LOCALE_SELECTED = Symbol('LOCALE_SELECTED')
export function selectLocale (localeId) {
return {
type: LOCALE_SELECTED,
Expand All @@ -112,15 +114,13 @@ export function selectLocale (localeId) {
}
}

export const STATS_FETCHED = Symbol('STATS_FETCHED')
export function statsFetched (stats) {
return {
type: STATS_FETCHED,
data: stats
}
}

export const HEADER_DATA_FETCHED = Symbol('HEADER_DATA_FETCHED')
export function headerDataFetched (data) {
return {type: HEADER_DATA_FETCHED, data: data}
}
Expand Down
@@ -1,6 +1,8 @@
import { fetchDocuments } from '../api'
import {
ROUTING_PARAMS_CHANGED
} from './action-types'

export const ROUTING_PARAMS_CHANGED = Symbol('ROUTING_PARAMS_CHANGED')
export function routingParamsChanged (newParams) {
// TODO pahuang should we start fetching thing here?

Expand Down Expand Up @@ -95,7 +97,6 @@ export function documentListFetched (projectSlug, versionSlug, documents) {
}
}

export const SET_SIDEBAR_VISIBILITY = Symbol('SET_SIDEBAR_VISIBILITY')
export function setSidebarVisibility (visible) {
return {
type: SET_SIDEBAR_VISIBILITY,
Expand Down
@@ -0,0 +1,23 @@
export const TOGGLE_SUGGESTIONS = Symbol('TOGGLE_SUGGESTIONS')
export const DIFF_SETTING_CHANGED = Symbol('DIFF_SETTING_CHANGED')
export const SET_SUGGESTION_SEARCH_TYPE = Symbol('SET_SUGGESTION_SEARCH_TYPE')
export const RESET_SUGGESTIONS_COPYING = Symbol('RESET_SUGGESTIONS_COPYING')
// FIXME may be unused
export const COPY_SUGGESTION_N = Symbol('COPY_SUGGESTION_N')
export const COPY_SUGGESTION = Symbol('COPY_SUGGESTION')
export const TEXT_SUGGESTION_STARTED_COPYING =
Symbol('TEXT_SUGGESTION_STARTED_COPYING')
export const TEXT_SUGGESTION_FINISHED_COPYING =
Symbol('TEXT_SUGGESTION_FINISHED_COPYING')
export const PHRASE_SUGGESTION_STARTED_COPYING =
Symbol('PHRASE_SUGGESTION_STARTED_COPYING')
export const PHRASE_SUGGESTION_FINISHED_COPYING =
Symbol('PHRASE_SUGGESTION_FINISHED_COPYING')
export const TEXT_SUGGESTIONS_UPDATED = Symbol('TEXT_SUGGESTIONS_UPDATED')
export const SUGGESTION_SEARCH_TEXT_CHANGE =
Symbol('SUGGESTION_SEARCH_TEXT_CHANGE')
export const PHRASE_SUGGESTIONS_UPDATED = Symbol('PHRASE_SUGGESTIONS_UPDATED')
export const SUGGESTION_PANEL_HEIGHT_CHANGE =
Symbol('SUGGESTION_PANEL_HEIGHT_CHANGE')
export const SHOW_DETAIL_FOR_SUGGESTION_BY_INDEX =
Symbol('SHOW_DETAIL_FOR_SUGGESTION_BY_INDEX')
@@ -1,8 +1,22 @@
import { getSuggestions } from '../api/suggestions'
import { waitForPhraseDetail } from '../utils/phrase-util'
import { debounce, isUndefined } from 'lodash'

export const TOGGLE_SUGGESTIONS = Symbol('TOGGLE_SUGGESTIONS')
import {
TOGGLE_SUGGESTIONS,
DIFF_SETTING_CHANGED,
SET_SUGGESTION_SEARCH_TYPE,
RESET_SUGGESTIONS_COPYING,
COPY_SUGGESTION,
TEXT_SUGGESTION_STARTED_COPYING,
TEXT_SUGGESTION_FINISHED_COPYING,
PHRASE_SUGGESTION_STARTED_COPYING,
PHRASE_SUGGESTION_FINISHED_COPYING,
TEXT_SUGGESTIONS_UPDATED,
SUGGESTION_SEARCH_TEXT_CHANGE,
PHRASE_SUGGESTIONS_UPDATED,
SUGGESTION_PANEL_HEIGHT_CHANGE,
SHOW_DETAIL_FOR_SUGGESTION_BY_INDEX
} from './suggestions-action-types'
export function toggleSuggestions () {
return {
type: TOGGLE_SUGGESTIONS
Expand All @@ -29,7 +43,6 @@ export function togglePhraseSuggestions () {
}
}

export const DIFF_SETTING_CHANGED = Symbol('DIFF_SETTING_CHANGED')
export function diffSettingChanged () {
return { type: DIFF_SETTING_CHANGED }
}
Expand All @@ -56,7 +69,6 @@ export function changeSearchText (searchText) {
}
}

export const SET_SUGGESTION_SEARCH_TYPE = Symbol('SET_SUGGESTION_SEARCH_TYPE')
export function setSuggestionSearchType (type) {
if (type !== 'phrase' && type !== 'text') {
console.error('invalid search type', type)
Expand All @@ -74,12 +86,10 @@ export function toggleSearchType () {
}
}

export const RESET_SUGGESTIONS_COPYING = Symbol('RESET_SUGGESTIONS_COPYING')
export function resetSuggestionsCopying () {
return { type: RESET_SUGGESTIONS_COPYING }
}

export const COPY_SUGGESTION_N = Symbol('COPY_SUGGESTION_N')
export function copySuggestionN (index) {
// Decision: keep the logic in here to choose what to copy
// reason: reducers are not an easy place to follow complex logic,
Expand Down Expand Up @@ -127,36 +137,26 @@ function copyPhraseSuggestionN (phraseId, index) {
}
}

export const COPY_SUGGESTION = Symbol('COPY_SUGGESTION')
function copySuggestion (suggestion) {
return { type: COPY_SUGGESTION, suggestion }
}

export const TEXT_SUGGESTION_STARTED_COPYING =
Symbol('TEXT_SUGGESTION_STARTED_COPYING')
function textSuggestionStartedCopying (index) {
return { type: TEXT_SUGGESTION_STARTED_COPYING, index }
}

export const TEXT_SUGGESTION_FINISHED_COPYING =
Symbol('TEXT_SUGGESTION_FINISHED_COPYING')
function textSuggestionFinishedCopying (index) {
return { type: TEXT_SUGGESTION_FINISHED_COPYING, index }
}

export const PHRASE_SUGGESTION_STARTED_COPYING =
Symbol('PHRASE_SUGGESTION_STARTED_COPYING')
function phraseSuggestionStartedCopying (phraseId, index) {
return { type: PHRASE_SUGGESTION_STARTED_COPYING, phraseId, index }
}

export const PHRASE_SUGGESTION_FINISHED_COPYING =
Symbol('PHRASE_SUGGESTION_FINISHED_COPYING')
function phraseSuggestionFinishedCopying (phraseId, index) {
return { type: PHRASE_SUGGESTION_FINISHED_COPYING, phraseId, index }
}

export const TEXT_SUGGESTIONS_UPDATED = Symbol('TEXT_SUGGESTIONS_UPDATED')
export function textSuggestionsUpdated (
{loading, searchStrings, suggestions, timestamp}) {
return {
Expand All @@ -168,8 +168,6 @@ export function textSuggestionsUpdated (
}
}

export const SUGGESTION_SEARCH_TEXT_CHANGE =
Symbol('SUGGESTION_SEARCH_TEXT_CHANGE')
export function suggestionSearchTextChange (text) {
return { type: SUGGESTION_SEARCH_TEXT_CHANGE, text: text }
}
Expand Down Expand Up @@ -311,7 +309,6 @@ export function findPhraseSuggestions (phrase) {
}
}

export const PHRASE_SUGGESTIONS_UPDATED = Symbol('PHRASE_SUGGESTIONS_UPDATED')
export function phraseSuggestionsUpdated (
{phraseId, loading, searchStrings, suggestions, timestamp}) {
return {
Expand All @@ -324,17 +321,13 @@ export function phraseSuggestionsUpdated (
}
}

export const SUGGESTION_PANEL_HEIGHT_CHANGE =
Symbol('SUGGESTION_PANEL_HEIGHT_CHANGE')
export function saveSuggestionPanelHeight (percentageHeight) {
return {
type: SUGGESTION_PANEL_HEIGHT_CHANGE,
percentageHeight
}
}

export const SHOW_DETAIL_FOR_SUGGESTION_BY_INDEX =
Symbol('SHOW_DETAIL_FOR_SUGGESTION_BY_INDEX')

/**
* Open or close the suggestion detail modal.
Expand Down
@@ -1,4 +1,4 @@
import { ROUTING_PARAMS_CHANGED } from '../actions'
import { ROUTING_PARAMS_CHANGED } from '../actions/action-types'
import { DEFAULT_LOCALE } from './ui-reducer'

const defaultState = {
Expand Down
@@ -0,0 +1,39 @@
jest.disableAutomock()

import contextReducer from './context-reducer'
import { ROUTING_PARAMS_CHANGED } from '../actions/action-types'
import { DEFAULT_LOCALE } from './ui-reducer'

describe('context-reducer test', () => {
it('generates initial state', () => {
const initial = contextReducer(undefined, { type: 'an action' })
expect(initial).toEqual({
sourceLocale: DEFAULT_LOCALE
})
})

it('merges in new routing params', () => {
const initial = {
sourceLocale: DEFAULT_LOCALE,
a: 'a',
b: 'b',
c: 'c'
}
const updated = contextReducer(initial, {
type: ROUTING_PARAMS_CHANGED,
// Note: the reducer does not check for valid internal structure of params
params: {
a: 'a',
b: 'B',
d: 'd'
}
})
expect(updated).toEqual({
sourceLocale: DEFAULT_LOCALE,
a: 'a',
b: 'B',
c: 'c',
d: 'd'
})
})
})
@@ -1,19 +1,19 @@
import { SET_SIDEBAR_VISIBILITY } from '../actions'
import { SET_SIDEBAR_VISIBILITY } from '../actions/action-types'
import {
CHANGE_UI_LOCALE,
TOGGLE_GLOSSARY,
TOGGLE_HEADER,
TOGGLE_KEY_SHORTCUTS,
UI_LOCALES_FETCHED
} from '../actions/header-actions'
} from '../actions/header-action-types'
import {
RESET_STATUS_FILTERS,
UPDATE_STATUS_FILTER
} from '../actions/controls-header-actions'
import {
SUGGESTION_PANEL_HEIGHT_CHANGE,
TOGGLE_SUGGESTIONS
} from '../actions/suggestions-actions'
} from '../actions/suggestions-action-types'
import {prepareLocales} from '../utils/Util'
import updateObject from 'react-addons-update'

Expand Down

0 comments on commit 6dc32cd

Please sign in to comment.