Files
old-krovovi-kalkulator/test/integration/full_user_flow_test.py
2017-11-21 17:11:29 +01:00

270 lines
12 KiB
Python

import os
import unittest
import mockredis
from splinter import Browser
from helix import main
from helix.constants import redis_constant
from helix.constants import sql_constant
from helix.constants.anchor_type import AnchorType
from helix.constants.inverter_type import InverterType
from helix.constants.system_type import SystemType
from helix.constants.module_type import ModuleType
from helix.constants.version import version
from helix.models.sql.power_stations import PowerStation
from test.integration.integration_test_helpers import *
from test.test_helpers import test_db_session, reset_db_session
class FullUserFlowTest(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.test_db_session = test_db_session()
@classmethod
def tearDownClass(cls):
cls.test_db_session.close_all()
def setUp(self):
redis_constant.redis_store = mockredis.mock_redis_client()
sql_constant.sql_session_maker = lambda: self.test_db_session
self.app = main.app.test_client()
self.browser = Browser('flask', app=main.app)
self.browser.visit('/site_characterization/')
def tearDown(self):
reset_db_session(self.test_db_session)
def fill_in_site_characterization_data(self):
self.browser.fill('project_name', 'Test Project Name')
self.browser.fill('building_width', '200')
self.browser.fill('building_height', '30')
self.browser.fill('building_length', '75.5')
self.browser.fill('wind_speed', '125')
self.browser.fill('exposure_category', 'C')
self.browser.fill('ballast_block_weight', '13')
self.browser.fill('building_parapet_height', '0')
self.browser.fill('max_system_pressure', '10')
self.browser.fill('system_type', SystemType.singleTilt.value)
self.browser.fill('anchor_type', AnchorType.EcoFasten.value)
self.browser.fill('design_spectral_response', '1')
def attach_file(self, file):
self.browser.visit('/array_summary/')
self.browser.attach_file('file_upload', file)
def attach_dxf(self, dxf_file):
self.browser.visit('/array_summary/')
self.browser.attach_file('dxf_upload', dxf_file)
def advance_n_times(self, advance_count):
for _ in range(advance_count):
self.browser.find_by_value('Next').first.click()
def test_uploading_and_downloading_dual_tilt_csv(self):
"""
This is using data from an old-style file but works because
the old spacing is within the new spacing's variance tolerance
"""
with open('test/fixtures/expected_dual_tilt.csv', 'r', newline='') as csv_file:
csv_content = csv_file.read()
self.browser.fill('project_name', 'Test Project Name')
self.browser.fill('building_width', '1000')
self.browser.fill('building_height', '100')
self.browser.fill('building_length', '1500')
self.browser.fill('wind_speed', '110')
self.browser.fill('exposure_category', 'D')
self.browser.fill('ballast_block_weight', '20')
self.browser.fill('building_parapet_height', '0')
self.browser.fill('max_system_pressure', '17')
self.browser.fill('system_type', SystemType.dualTilt.value)
self.browser.fill('anchor_type', AnchorType.EcoFasten.value)
self.browser.fill('design_spectral_response', '1')
self.advance_n_times(1)
self.attach_file('test/fixtures/input_dual_tilt.csv')
self.advance_n_times(3)
self.browser.click_link_by_partial_text('Download AutoCAD import file')
eq_(self.browser.html, csv_content)
eq_(self.browser._response.headers['Content-Disposition'], 'attachment; filename=test_project_name_result.txt')
def test_clicking_back_at_download_goes_to_power_station_configuration(self):
self.browser.visit('/download/')
assert not self.browser.is_text_present('Next')
assert self.browser.is_text_present('Back')
self.browser.click_link_by_partial_text('Back')
assert_step_is_active(self.browser, 4)
def test_uploading_and_downloading_single_tilt_csv(self):
with open('test/fixtures/expected_single_tilt.csv', 'r', newline='') as csv_file:
csv_content = csv_file.read()
self.browser.fill('project_name', 'Test Project Name')
self.browser.fill('building_width', '1000')
self.browser.fill('building_height', '100')
self.browser.fill('building_length', '1500')
self.browser.fill('wind_speed', '110')
self.browser.fill('exposure_category', 'D')
self.browser.fill('ballast_block_weight', '20')
self.browser.fill('building_parapet_height', '0')
self.browser.fill('max_system_pressure', '17')
self.browser.fill('system_type', SystemType.singleTilt.value)
self.browser.fill('anchor_type', AnchorType.EcoFasten.value)
self.browser.fill('design_spectral_response', '1')
self.advance_n_times(1)
self.attach_file('test/fixtures/input_single_tilt.csv')
self.advance_n_times(3)
self.browser.click_link_by_partial_text('Download AutoCAD import file')
eq_(self.browser.html, csv_content)
eq_(self.browser._response.headers['Content-Disposition'], 'attachment; filename=test_project_name_result.txt')
def test_downloading_coordinates_csv(self):
#with open('test/fixtures/expected_dual_tilt_big_spacing.txt', 'r', newline='') as csv_file:
with open('test/fixtures/expected_small_dual_tilt.txt', 'r', newline='') as csv_file:
csv_content = csv_file.read()
self.browser.fill('project_name', 'Test Project Name')
self.browser.fill('building_width', '450')
self.browser.fill('building_height', '35')
self.browser.fill('building_length', '500')
self.browser.fill('wind_speed', '110')
self.browser.fill('exposure_category', 'B')
self.browser.fill('ballast_block_weight', '14')
self.browser.fill('building_parapet_height', '5')
self.browser.fill('max_system_pressure', '10')
self.browser.fill('system_type', SystemType.dualTilt.value)
self.browser.fill('anchor_type', AnchorType.OMG_PowerGrip_Plus.value)
self.browser.fill('design_spectral_response', '1.5')
self.browser.fill('module_type', ModuleType.Cell96.value)
self.advance_n_times(1)
self.attach_file('test/fixtures/input_small_dual_tilt.csv')
self.advance_n_times(1)
self.browser.visit('/download/')
self.browser.click_link_by_partial_text('Download AutoCAD import file')
eq_(self.browser.html, csv_content)
eq_(self.browser._response.headers['Content-Disposition'], 'attachment; filename=test_project_name_result.txt')
# def test_uploading_dxf_and_downloading_csv(self):
# self.browser.fill('project_name', 'Test Project Name')
# self.browser.fill('building_width', '100')
# self.browser.fill('building_height', '30')
# self.browser.fill('building_length', '100')
# self.browser.fill('building_parapet_height', '5')
# self.browser.fill('wind_speed', '130')
# self.browser.fill('exposure_category', 'C')
# self.browser.fill('ballast_block_weight', '14')
# self.browser.fill('max_system_pressure', '12')
# self.browser.fill('system_type', SystemType.dualTilt.value)
# self.browser.fill('anchor_type', AnchorType.OMG_PowerGrip_Plus.value)
# self.browser.fill('design_spectral_response', '0.5')
#
# self.advance_n_times(1)
# self.attach_dxf('test/fixtures/dxf/input_dual_tilt_96_cell.dxf')
#
# self.advance_n_times(1)
# self.browser.visit('/download/')
# self.browser.click_link_by_partial_text('Download AutoCAD import file')
# assert self.browser.html != ''
# eq_(self.browser._response.headers['Content-Disposition'], 'attachment; filename=test_project_name_result.txt')
def test_downloading_documentation(self):
self.fill_in_site_characterization_data()
self.advance_n_times(1)
self.attach_file('test/fixtures/input_single_tilt_csv_for_bom.csv')
self.advance_n_times(3)
os.environ['SP_DOCGEN_API_KEY'] = 'DC97-20AF-567E'
self.browser.click_link_by_partial_text('Download Project Report')
os.environ['SP_DOCGEN_API_KEY'] = ''
# with open('test/fixtures/expected_single_tilt_documentation.pdf', 'r', newline='') as pdf_file:
# expected_doc = pdf_file.read()
#
# eq_(self.browser.html, expected_doc)
eq_(self.browser._response.headers['Content-Disposition'], 'attachment; filename=test_project_name_documentation.pdf')
def test_downloading_BOM_dual_tilt(self):
assert len(self.browser.find_by_text('Download BOM')) == 0
self.fill_in_site_characterization_data()
self.browser.fill('system_type', SystemType.dualTilt.value)
self.advance_n_times(1)
self.attach_file('test/fixtures/input_dual_tilt_csv_for_bom.csv')
self.advance_n_times(3)
self.browser.click_link_by_partial_text('Download BOM')
with open('test/fixtures/expected_dual_tilt_bom.csv', 'r', newline='') as csv_file:
expected_bom = csv_file.read()
eq_(self.browser.html, expected_bom)
eq_(self.browser._response.headers['Content-Disposition'], 'attachment; filename=test_project_name_bom.txt')
def test_downloading_BOM_single_tilt(self):
assert len(self.browser.find_by_text('Download BOM')) == 0
self.fill_in_site_characterization_data()
self.advance_n_times(1)
self.attach_file('test/fixtures/input_single_tilt_csv_for_bom.csv')
self.advance_n_times(2)
fill_in_power_station(self.browser, name='Test Power Station Name', count=1, inverter_count=3,
inverters=[
{
'model': InverterType.SMA.MODEL_15KW,
'strings': 3,
'sunshade': True,
'dc_switch': True
},
{
'model': InverterType.SMA.MODEL_12KW,
'sunshade': True,
'dc_switch': True,
'strings': 4
},
{
'model': InverterType.SMA.MODEL_24KW,
'sunshade': True,
'dc_switch': True,
'strings': 7
}
])
submit_power_station_form(self.browser)
first_power_station_id = str(self.test_db_session.query(PowerStation).first().id)
fill_in_power_station(self.browser, count=5, inverter_count=2,
inverters=[
{
'model': InverterType.SMA.MODEL_24KW,
'strings': 8,
},
{
'model': InverterType.SMA.MODEL_12KW,
'strings': 2
}
])
submit_power_station_form(self.browser)
fill_in_standalone_inverter(self.browser, model=InverterType.SMA.MODEL_15KW, sunshade=True, dc_switch=True, strings=3)
submit_standalone_inverter_form(self.browser)
fill_in_standalone_inverter(self.browser, model=InverterType.SMA.MODEL_15KW, sunshade=True, dc_switch=True, strings=3)
self.browser.fill('attachment_point', first_power_station_id)
submit_standalone_inverter_form(self.browser)
self.advance_n_times(1)
self.browser.click_link_by_partial_text('Download BOM')
with open('test/fixtures/expected_single_tilt_bom.csv', 'r', newline='') as csv_file:
expected_bom = csv_file.read()
eq_(self.browser.html, expected_bom)
eq_(self.browser._response.headers['Content-Disposition'], 'attachment; filename=test_project_name_bom.txt')