summaryrefslogtreecommitdiff
path: root/web/src/App.test.jsx
blob: ced7ac0e101b1e8efcc42b32ec7781a7de98ca73 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
// Copyright 2018 Red Hat, Inc
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may
// not use this file except in compliance with the License. You may obtain
// a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations
// under the License.

import React from 'react'
import ReactTestUtils from 'react-dom/test-utils'
import ReactDOM from 'react-dom'
import { Link, BrowserRouter as Router } from 'react-router-dom'
import { Provider } from 'react-redux'

import { fetchInfoIfNeeded } from './actions/info'
import store from './store'
import App from './App'
import TenantsPage from './pages/Tenants'
import StatusPage from './pages/Status'
import * as api from './api'

api.fetchInfo = jest.fn()
api.fetchTenants = jest.fn()
api.fetchStatus = jest.fn()
api.fetchConfigErrors = jest.fn()
api.fetchConfigErrors.mockImplementation(() => Promise.resolve({data: []}))


it('renders without crashing', () => {
  const div = document.createElement('div')
  ReactDOM.render(<Provider store={store}><Router><App /></Router></Provider>,
    div)
  ReactDOM.unmountComponentAtNode(div)
})

it('renders multi tenant', () => {
  api.fetchInfo.mockImplementation(
    () => Promise.resolve({data: {
      info: {capabilities: {}}
    }})
  )
  api.fetchTenants.mockImplementation(
    () => Promise.resolve({data: [{name: 'openstack'}]})
  )
  const application = ReactTestUtils.renderIntoDocument(
    <Provider store={store}><Router><App /></Router></Provider>
  )
  store.dispatch(fetchInfoIfNeeded()).then(() => {
    // Link should be tenant scoped
    const topMenuLinks = ReactTestUtils.scryRenderedComponentsWithType(
      application, Link)
    expect(topMenuLinks[0].props.to).toEqual('/t/openstack/status')
    expect(topMenuLinks[1].props.to).toEqual('/t/openstack/projects')
    // Location should be /tenants
    expect(location.pathname).toEqual('/tenants')
    // Info should tell multi tenants
    expect(store.getState().info.tenant).toEqual(undefined)
    // Tenants list has been rendered
    expect(ReactTestUtils.findRenderedComponentWithType(
      application, TenantsPage)).not.toEqual(null)
    // Fetch tenants has been called
    expect(api.fetchTenants).toBeCalled()
  })
})

it('renders single tenant', () => {
  api.fetchInfo.mockImplementation(
    () => Promise.resolve({data: {
      info: {capabilities: {}, tenant: 'openstack'}
    }})
  )
  api.fetchStatus.mockImplementation(
    () => Promise.resolve({data: {pipelines: []}})
  )
  const application = ReactTestUtils.renderIntoDocument(
    <Provider store={store}><Router><App /></Router></Provider>
  )

  store.dispatch(fetchInfoIfNeeded()).then(() => {
    // Link should be white-label scoped
    const topMenuLinks = ReactTestUtils.scryRenderedComponentsWithType(
      application, Link)
    expect(topMenuLinks[0].props.to).toEqual('/status')
    expect(topMenuLinks[1].props.to).toEqual('/projects')
    // Location should be /status
    expect(location.pathname).toEqual('/status')
    // Info should tell white label tenant openstack
    expect(store.getState().info.tenant).toEqual('openstack')
    // Status page has been rendered
    expect(ReactTestUtils.findRenderedComponentWithType(
      application, StatusPage)).not.toEqual(null)
    // Fetch status has been called
    expect(api.fetchStatus).toBeCalled()
  })
})