270 lines
12 KiB
Python
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')
|