def test_get_next_oldest(client, jwt, app): # add NR to database from namex.models import Request as RequestDAO, State nr = RequestDAO() nr.nrNum = 'NR 0000001' nr.stateCd = State.DRAFT nr._source = 'NRO' nr.save_to_db() for i in range(2, 12): nr = RequestDAO() nr.nrNum = 'NR {0:07d}'.format(i) nr.stateCd = State.DRAFT nr._source = 'NRO' nr.save_to_db() # create JWT & setup header with a Bearer Token using the JWT token = jwt.create_jwt(claims, token_header) headers = {'Authorization': 'Bearer ' + token} # The message expected to be returned json_msg = jsonify(nameRequest='NR 0000001') # get the resource (this is the test) rv = client.get('/api/v1/requests/queues/@me/oldest', headers=headers) assert b'"nameRequest": "NR 0000001"' in rv.data
def build_rejected(data=None, test_names=None, generate_id_seq=None): """ :param data: :param test_names: :param generate_id_seq: :return: """ nr = RequestDAO() # Set defaults, if these exist in the provided data they will be overwritten nr.stateCd = State.REJECTED nr.requestId = 1460775 nr._source = 'NRO' if not data: data = {} # Map the data, if provided for key, value in data.items(): # Don't set list attrs, they have to be set separately to handle sequences if hasattr(nr, key) and not isinstance(data.get(key), list): nr.__setattr__(key, value) nr.names = [] for test_name in test_names: nr.names.append(build_name(test_name, generate_id_seq)) return nr
def test_get_inprogress_event_history(client, jwt, app): from namex.models import Request as RequestDAO, State, Name as NameDAO, User, Event from namex.services import EventRecorder # add a user for the comment user = User('test-user', '', '', '43e6a245-0bf7-4ccf-9bd0-e7fb85fd18cc', 'https://sso-dev.pathfinder.gov.bc.ca/auth/realms/sbc') user.save_to_db() # create JWT & setup header with a Bearer Token using the JWT token = jwt.create_jwt(claims, token_header) headers = { 'Authorization': 'Bearer ' + token, 'content-type': 'application/json' } nr = RequestDAO() nr.nrNum = 'NR 0000002' nr.stateCd = State.INPROGRESS nr.requestId = 1460775 nr._source = 'NRO' name1 = NameDAO() name1.choice = 1 name1.name = 'TEST NAME ONE' nr.names = [name1] nr.save_to_db() EventRecorder.record(user, Event.PATCH, nr, {}) # get the resource (this is the test) rv = client.get('/api/v1/events/NR%200000002', headers=headers) assert rv.status_code == 200 assert b'"user_action": "Load NR"' in rv.data
def test_reopen_event_history(client, jwt, app): from namex.models import Request as RequestDAO, State, Name as NameDAO, User, Event from namex.services import EventRecorder # add a user for the comment user = User('test-user', '', '', '43e6a245-0bf7-4ccf-9bd0-e7fb85fd18cc', 'https://sso-dev.pathfinder.gov.bc.ca/auth/realms/sbc') user.save_to_db() headers = create_header(jwt, [User.EDITOR]) nr = RequestDAO() nr.nrNum = 'NR 0000002' nr.stateCd = State.REJECTED nr.requestId = 1460775 nr._source = 'NRO' name1 = NameDAO() name1.choice = 1 name1.name = 'TEST NAME ONE' nr.names = [name1] nr.save_to_db() EventRecorder.record(user, Event.PATCH, nr, {}) nr.stateCd = State.INPROGRESS EventRecorder.record(user, Event.PUT, nr, { "additional": "additional", "furnished": "N" }) # get the resource (this is the test) rv = client.get('/api/v1/events/NR%200000002', headers=headers) assert rv.status_code == 200 assert b'"user_action": "Re-Open"' in rv.data
def create_nr(nr_num: str, request_state: str, names: list, names_state: list): now = datetime.utcnow() with freeze_time(now): name_request = Request() name_request.nrNum = nr_num name_request.stateCd = request_state name_request._source = 'NRO' name_request.expirationDate = add_years(now, 1) name_request.entity_type_cd = 'CR' # name_request.priorityCd = start_priority name_request.save_to_db() for index, name in enumerate(names): name_state = names_state[index] choice = index + 1 name_obj = Name() name_obj.nrId = name_request.id name_obj.name = name name_obj.state = name_state name_obj.choice = choice name_obj.name_type_cd = 'CO' name_obj.save_to_db() return name_request
def save_words_list_name(words_list, queue=False): from namex.models import Request as RequestDAO, State, Name as NameDAO num = 0 req = 1460775 for record in words_list: nr_num_label = 'NR 00000' num += 1 req += 1 nr_num = nr_num_label + str(num) nr = RequestDAO() nr.nrNum = nr_num if queue: nr.stateCd = State.DRAFT nr.expirationDate = datetime.date.today() + datetime.timedelta(days=1) else: nr.stateCd = State.APPROVED nr.requestId = req nr.requestTypeCd = EntityTypes.CORPORATION.value nr._source = 'NAMEREQUEST' name = NameDAO() name.choice = 1 name.name = record name.state = State.APPROVED name.corpNum = '0652480' nr.names = [name] nr.save_to_db()
def test_comment_where_no_user(client, jwt, app): from namex.models import Request as RequestDAO, State, Name as NameDAO, Comment as CommentDAO, User nr = RequestDAO() nr.nrNum = 'NR 0000002' nr.stateCd = State.INPROGRESS nr.requestId = 1460775 nr._source = 'NRO' name1 = NameDAO() name1.choice = 1 name1.name = 'TEST NAME ONE' nr.names = [name1] nr.save_to_db() # create JWT & setup header with a Bearer Token using the JWT token = jwt.create_jwt(claims, token_header) headers = { 'Authorization': 'Bearer ' + token, 'content-type': 'application/json' } new_comment = {"comment": "The 13th comment entered by the user."} rv = client.post('/api/v1/requests/NR%200000002/comments', data=json.dumps(new_comment), headers=headers) assert 404 == rv.status_code
def test_full_access_to_name_request(test_name, \ name_request_number, temp_request_number, user_email, user_phone, \ header_name_request_number, header_temp_request_number, header_user_email, header_user_phone, \ expected): """Assure that this contains the headers required to fully access an NR.""" from namex.utils.auth import full_access_to_name_request # setup nr = RequestDAO() nr.nrNum = name_request_number or temp_request_number nr.stateCd = State.DRAFT nr._source = ValidSources.NAMEREQUEST.value applicant = Applicant() applicant.phoneNumber = user_phone applicant.emailAddress = user_email nr.applicants.append(applicant) nr.save_to_db() builder = EnvironBuilder(method='POST', data={}, headers={ 'BCREG_NR': header_name_request_number, 'BCREG_NRL': header_temp_request_number, 'BCREG-User-Email': header_user_email, 'BCREG-User-Phone': header_user_phone }) env = builder.get_environ() req = Request(env) print(req) assert expected == full_access_to_name_request(req)
def build_draft(data=None, test_names=None, generate_id_seq=None): try: nr = RequestDAO() # Set defaults, if these exist in the provided data they will be overwritten nr.stateCd = State.DRAFT nr.requestId = 1460775 nr._source = 'NRO' if not data: data = {} # Map the data, if provided for key, value in data.items(): # Don't set list attrs, they have to be set separately to handle sequences if hasattr(nr, key) and not isinstance(data.get(key), list): nr.__setattr__(key, value) nr.names = [] for test_name in test_names: nr.names.append(build_name(test_name, generate_id_seq)) return nr except Exception as err: print(repr(err))
def save_auto_approved_names(approved_number_records): from namex.models import Event as EventDAO, Request as RequestDAO, User as UserDAO, State num = 0 global num_records username = '******' usr = UserDAO(username, '', '', '', '') usr.id = 86 usr.save_to_db() while approved_number_records > num: nr_num_label = 'NR 00' num_records += 1 num += 1 nr_num = nr_num_label + str(num_records) nr = RequestDAO() nr.nrNum = nr_num nr.stateCd = State.APPROVED nr._source = 'NAMEREQUEST' event = EventDAO() event.action = EventAction.PUT.value event.userId = EventUserId.SERVICE_ACCOUNT.value event.stateCd = State.APPROVED event.eventDate = datetime.date.today() nr.events = [event] nr.save_to_db()
def test_add_new_comment_to_nr(client, jwt, app): from namex.models import Request as RequestDAO, State, Name as NameDAO, Comment as CommentDAO, User, \ Event as EventDAO from sqlalchemy import desc #add a user for the comment user = User('test-user', '', '', '43e6a245-0bf7-4ccf-9bd0-e7fb85fd18cc', 'https://sso-dev.pathfinder.gov.bc.ca/auth/realms/sbc') user.save_to_db() nr = RequestDAO() nr.nrNum = 'NR 0000002' nr.stateCd = State.INPROGRESS nr.requestId = 1460775 nr._source = 'NRO' name1 = NameDAO() name1.choice = 1 name1.name = 'TEST NAME ONE' nr.names = [name1] nr.save_to_db() comment1 = CommentDAO() comment1.comment = 'This is the first Comment' comment1.nr_id = nr.id comment1.examinerId = nr.userId nr.comments = [comment1] nr.save_to_db() # create JWT & setup header with a Bearer Token using the JWT token = jwt.create_jwt(claims, token_header) headers = { 'Authorization': 'Bearer ' + token, 'content-type': 'application/json' } # get the resource so we have a template for the request: rv = client.get('/api/v1/requests/NR%200000002', headers=headers) assert rv.status_code == 200 # assert we're starting with just one name: data = json.loads(rv.data) assert len(data['comments']) == 1 new_comment = {"comment": "The 13th comment entered by the user."} rv = client.post('/api/v1/requests/NR%200000002/comments', data=json.dumps(new_comment), headers=headers) assert b'"comment": "The 13th comment entered by the user."' in rv.data assert 200 == rv.status_code event_results = EventDAO.query.filter_by(nrId=nr.id).order_by( EventDAO.eventDate.desc()).first_or_404() assert event_results.action == 'post' assert event_results.eventJson[0:11] == '{"comment":'
async def test_update_payment_record( app, session, test_name, action_code, start_request_state, end_request_state, start_priority, end_priority, start_datetime, days_after_start_datetime, start_payment_state, end_payment_state, start_payment_date, end_payment_has_value, error): """Assert that the update_payment_record works as expected.""" from namex.models import Request, State, Payment from namex_pay.worker import update_payment_record print(test_name) now = datetime.utcnow() with freeze_time(now): # setup PAYMENT_TOKEN = 'dog' NR_NUMBER = 'NR B000001' name_request = Request() name_request.nrNum = NR_NUMBER name_request.stateCd = start_request_state name_request._source = 'NRO' name_request.expirationDate = start_datetime name_request.priorityCd = start_priority name_request.save_to_db() payment = Payment() payment.nrId = name_request.id payment._payment_token = PAYMENT_TOKEN payment._payment_status_code = start_payment_state payment.payment_action = action_code payment.furnished = False payment._payment_completion_date = start_payment_date payment.save_to_db() # run test if error: # expecting it to raise an error with pytest.raises(error): await update_payment_record(payment) else: # else it was processable if not (payment_final := await update_payment_record(payment)): payment_final = payment nr_final = Request.find_by_nr(NR_NUMBER) assert nr_final.stateCd == end_request_state assert nr_final.priorityCd == end_priority assert nr_final.expirationDate == ( start_datetime or now) + timedelta(days=days_after_start_datetime) assert eval( f'payment_final.payment_completion_date {end_payment_has_value} None' ) assert payment_final.payment_status_code == end_payment_state
def create_nr(nr_num: str, state_cd: str, submitted: datetime, names: list) -> Request: """Create new NR.""" nr = Request() nr.nrNum = nr_num nr.stateCd = state_cd nr.submittedDate = submitted nr._source = 'NRO' for name in names: nr.names.append( create_name(name['name'], name['state'], name['choice'])) nr.save_to_db() return nr
def save_name(submitted_date, nr_num, priority=False): from namex.models import Request as RequestDAO, State num = 0 global num_records nr_num_label = 'NR ' nr_num = nr_num_label + str(nr_num) nr = RequestDAO() nr.nrNum = nr_num nr.stateCd = State.DRAFT nr.priorityCd = 'Y' if priority else 'N' nr._source = 'NAMEREQUEST' nr.submittedDate = submitted_date nr.save_to_db()
def create_base_nr(): nr = RequestDAO() nr.nrNum = 'NR 0000002' nr.stateCd = State.PENDING_PAYMENT nr.requestId = 1460775 nr._source = ValidSources.NAMEREQUEST.value name1 = NameDAO() name1.choice = 1 name1.name = 'TEST NAME ONE' nr.names = [name1] nr.additionalInfo = 'test' nr.requestTypeCd = 'CR' nr.request_action_cd = 'NEW' nr.save_to_db() return nr
def save_names_queue(queue_number_records, priority=False): from namex.models import Request as RequestDAO, State num = 0 global num_records while queue_number_records > num: nr_num_label = 'NR ' num_records += 1 num += 1 nr_num = nr_num_label + str(num_records) nr = RequestDAO() nr.nrNum = nr_num nr.stateCd = State.DRAFT nr.priorityCd = 'Y' if priority else 'N' nr._source = 'NAMEREQUEST' nr.save_to_db()
def test_remove_name_from_nr(client, jwt, app): # add NR to database from namex.models import Request as RequestDAO, State, Name as NameDAO nr = RequestDAO() nr.nrNum = 'NR 0000002' nr.stateCd = State.INPROGRESS nr.requestId = 1460775 nr._source = 'NRO' name1 = NameDAO() name1.choice = 1 name1.name = 'ONE' name2 = NameDAO() name2.choice = 2 name2.name = 'TWO' nr.names = [name1, name2] nr.save_to_db() # create JWT & setup header with a Bearer Token using the JWT token = jwt.create_jwt(claims, token_header) headers = { 'Authorization': 'Bearer ' + token, 'content-type': 'application/json' } # get the resource so we have a template for the request: rv = client.get('/api/v1/requests/NR%200000002', headers=headers) assert rv.status_code == 200 # assert we're starting with just one name: data = json.loads(rv.data) assert len(data['names']) == 2 for name in data['names']: if name['choice'] == 2: name['name'] = '' # Update with one blank name name (should remove the blank name) rv = client.put('/api/v1/requests/NR%200000002', data=json.dumps(data), headers=headers) data = json.loads(rv.data) assert 200 == rv.status_code assert len(data['names']) == 1
def test_get_next_not_approver(client, jwt, app): # add NR to database from namex.models import Request as RequestDAO, State nr = RequestDAO() nr.nrNum = 'NR 0000001' nr.stateCd = State.DRAFT nr._source = 'NRO' nr.save_to_db() # create JWT & setup header with a Bearer Token using the JWT token = jwt.create_jwt(claims_editor, token_header) headers = {'Authorization': 'Bearer ' + token} expected_response = b'{\n "code": "missing_required_roles", \n "description": "Missing the role(s) required to access this endpoint"\n}\n' # get the resource (this is the test) rv = client.get('/api/v1/requests/queues/@me/oldest', headers=headers) assert rv.data == expected_response
def test_get_next_no_draft_avail(client, jwt, app): # add NR to database from namex.models import Request as RequestDAO, State nr = RequestDAO() nr.nrNum = 'NR 0000001' nr.stateCd = State.APPROVED nr._source = 'NRO' nr.save_to_db() # create JWT & setup header with a Bearer Token using the JWT token = jwt.create_jwt(claims, token_header) headers = {'Authorization': 'Bearer ' + token} # get the resource (this is the test) rv = client.get('/api/v1/requests/queues/@me/oldest', headers=headers) # should return 404, not found assert 404 == rv.status_code
def test_add_new_blank_name_to_nr(client, jwt, app): # add NR to database from namex.models import Request as RequestDAO, State, Name as NameDAO nr = RequestDAO() nr.nrNum = 'NR 0000002' nr.stateCd = State.INPROGRESS nr.requestId = 1460775 nr._source = 'NRO' name1 = NameDAO() name1.choice = 1 name1.name = 'ONE' nr.names = [name1] nr.save_to_db() # create JWT & setup header with a Bearer Token using the JWT token = jwt.create_jwt(claims, token_header) headers = { 'Authorization': 'Bearer ' + token, 'content-type': 'application/json' } # get the resource so we have a template for the request: rv = client.get('/api/v1/requests/NR%200000002', headers=headers) assert rv.status_code == 200 # assert we're starting with just one name: data = json.loads(rv.data) assert len(data['names']) == 1 new_name = data['names'][0].copy() new_name['name'] = '' new_name['choice'] = 2 data['names'].append(new_name) # Update with a brand new name (this is the test) rv = client.put('/api/v1/requests/NR%200000002', data=json.dumps(data), headers=headers) data = json.loads(rv.data) assert 200 == rv.status_code assert len(data['names']) == 1
def test_get_nr_view_only(client, jwt, app): # add NR to database from namex.models import Request as RequestDAO, State nr = RequestDAO() nr.nrNum = 'NR 0000001' nr.stateCd = State.DRAFT nr._source = 'NRO' nr.save_to_db() print("Role: {} ".format(claims_viewer.get('realm_access').get('roles'))) # create JWT & setup header with a Bearer Token using the JWT token = jwt.create_jwt(claims_viewer, token_header) headers = {'Authorization': 'Bearer ' + token} # The message expected to be returned json_msg = jsonify(nameRequest='NR 0000001') # get the resource (this is the test) rv = client.get('/api/v1/requests/NR%200000001', headers=headers) assert 200 == rv.status_code
def save_approved_names_by_examiner(approved_number_records): from namex.models import Request as RequestDAO, State, Event as EventDAO num = 0 global num_records while approved_number_records > num: num_records += 1 num += 1 nr_num_label = 'NR 00' nr_num = nr_num_label + str(num_records) nr = RequestDAO() nr.nrNum = nr_num nr.stateCd = State.APPROVED nr.submittedDate = datetime.date.today() - datetime.timedelta(days=2) nr._source = 'NAMEREQUEST' event = EventDAO() event.action = EventAction.PATCH.value event.stateCd = State.APPROVED event.eventDate = datetime.date.today() - datetime.timedelta(days=1) nr.events = [event] nr.save_to_db()
async def test_process_payment( app, session, mocker, test_name, action_code, start_request_state, start_priority, start_datetime, start_payment_state, start_payment_date, ): from namex.models import Request, State, Payment from namex_pay.worker import process_payment, FLASK_APP nest_asyncio.apply() # setup PAYMENT_TOKEN = 'dog' NR_NUMBER = 'NR B000001' name_request = Request() name_request.nrNum = NR_NUMBER name_request.stateCd = start_request_state name_request._source = 'NRO' name_request.expirationDate = start_datetime name_request.priorityCd = start_priority name_request.save_to_db() payment = Payment() payment.nrId = name_request.id payment._payment_token = PAYMENT_TOKEN payment._payment_status_code = start_payment_state payment.payment_action = action_code payment.furnished = False payment._payment_completion_date = start_payment_date payment.save_to_db() # setup mock and patch msg = None def catch(qsm, cloud_event_msg): nonlocal msg msg = cloud_event_msg mocker.patch('namex_pay.worker.publish_email_message', side_effect=catch) # Test pay_msg = { "paymentToken": { "id": PAYMENT_TOKEN, "statusCode": "COMPLETED", "filingIdentifier": None } } await process_payment(pay_msg, FLASK_APP) print(msg) # Verify message that would be sent to the email server assert msg['type'] == 'bc.registry.names.request' assert msg['source'] == '/requests/NR B000001' assert msg['datacontenttype'] == 'application/json' assert msg['identifier'] == 'NR B000001' assert msg['data']['request']['header']['nrNum'] == NR_NUMBER assert msg['data']['request']['paymentToken'] == PAYMENT_TOKEN assert msg['data']['request']['statusCode'] == 'DRAFT'
async def test_furnish_receipt_message(app, session, stan_server, event_loop, client_id, entity_stan, future): """Assert that events are placed on the email queue and the payment is marked furnished.""" from queue_common.messages import create_cloud_event_msg from queue_common.service import ServiceWorker from queue_common.service_utils import subscribe_to_queue from namex_pay.worker import APP_CONFIG, furnish_receipt_message, qsm from namex.models import Request, State, Payment print('test vars') print(app, session, stan_server, event_loop, client_id, entity_stan, future) # setup PAYMENT_TOKEN = 'dog' NR_NUMBER = 'NR B000001' name_request = Request() name_request.nrNum = NR_NUMBER name_request.stateCd = State.DRAFT name_request._source = 'NRO' name_request.save_to_db() payment = Payment() payment.nrId = name_request.id payment._payment_token = PAYMENT_TOKEN payment._payment_status_code = 'COMPLETED' payment.furnished = False payment.save_to_db() # file handler callback msgs = [] s = ServiceWorker() s.sc = entity_stan qsm.service = s async def cb_handler(msg): nonlocal msgs nonlocal future msgs.append(msg) print('call back recvd') if len(msgs) == 1: future.set_result(True) file_handler_subject = APP_CONFIG.EMAIL_PUBLISH_OPTIONS['subject'] print(f'file_handler_subject:{file_handler_subject}') await subscribe_to_queue(entity_stan, file_handler_subject, f'entity_queue.{file_handler_subject}', f'entity_durable_name.{file_handler_subject}', cb_handler) print(payment.as_dict()) # sanity check assert name_request.id assert payment.nrId == name_request.id # test await furnish_receipt_message(qsm, payment) try: await asyncio.wait_for(future, 1, loop=event_loop) except Exception as err: print(err) # results processed_payment = Payment.find_by_payment_token(PAYMENT_TOKEN) # verify assert processed_payment.furnished assert len(msgs) == 1 cloud_event = json.loads(msgs[0].data.decode('utf-8')) assert cloud_event['identifier'] == NR_NUMBER