def test_txt_urls_smoke(self, real_test_client): aapl = CompanyFilings(client=real_test_client, cik_lookup="aapl", filing_type=FilingType.FILING_10Q, count=10) first_txt_url = aapl.get_urls()["aapl"][0] assert first_txt_url.split(".")[-1] == "txt"
def filing(ctx, lookups, ftype, start, end, count, directory): r"""Click command for downloading filings. Run ``secedgar filing --help`` for info. \f Args: ctx (click.core.Context): Click context. lookups (str): Companies and tickers to include in filing download. ftype (str): String of FilingType enum. start (str): Start date for filings in YYYYMMDD format. Will implicitly default to first available filing. end (str): End date for filings in YYYYMMDD format. Will implicitly default to today. count (int): Number of filings to save per ticker/company. directory (str): Directory where files should be saved. Defaults to current working directory. Returns: None """ # If given filing type is not valid enum, raise FilingTypeError try: ftype = FilingType[ftype] except KeyError: raise FilingTypeError() f = CompanyFilings(cik_lookup=lookups, filing_type=ftype, start_date=date_cleanup(start), end_date=date_cleanup(end), count=count, user_agent=ctx.obj['user_agent']) f.save(directory=directory)
def test_end_date_setter(self, date, expected): f = CompanyFilings("aapl", FilingType.FILING_10Q, start_date=datetime.datetime(2010, 1, 1), end_date=datetime.datetime(2015, 1, 1)) f.end_date = date assert f.end_date == date and f.params.get("dateb") == expected
def test_save_no_filings_raises_error(self, tmp_data_directory, monkeypatch, no_urls): monkeypatch.setattr(CompanyFilings, "get_urls", lambda x: no_urls) f = CompanyFilings(cik_lookup="aapl", filing_type=FilingType.FILING_10K) with pytest.raises(NoFilingsError): f.save(tmp_data_directory)
def test_txt_urls(self, mock_cik_validator_get_single_cik, mock_single_cik_filing): aapl = CompanyFilings(cik_lookup="aapl", filing_type=FilingType.FILING_10Q, count=10) first_txt_url = aapl.get_urls()["aapl"][0] assert first_txt_url.split(".")[-1] == "txt"
def test_filing_save_multiple_ciks_smoke(self, tmp_data_directory, real_test_client): f = CompanyFilings(["aapl", "amzn", "msft"], FilingType.FILING_10Q, client=real_test_client, count=3) f.save(tmp_data_directory) assert len(os.listdir(tmp_data_directory)) > 0
def test_filing_save_single_cik_smoke(self, tmp_data_directory, real_test_client): f = CompanyFilings("aapl", FilingType.FILING_10Q, client=real_test_client, count=3) f.save(tmp_data_directory) assert len(os.listdir(tmp_data_directory)) > 0
def test_filing_simple_example_smoke(self, tmp_data_directory, mock_user_agent): my_filings = CompanyFilings(cik_lookup="IBM", filing_type=FilingType.FILING_10Q, user_agent=mock_user_agent) my_filings.save(tmp_data_directory) assert len(os.listdir(tmp_data_directory) ) > 0, "No file or directory created after save."
def test_filing_save_multiple_ciks(self, tmp_data_directory, mock_cik_validator_get_multiple_ciks, mock_single_cik_filing, mock_filing_response): f = CompanyFilings(["aapl", "amzn", "msft"], FilingType.FILING_10Q, count=3) f.save(tmp_data_directory)
def test_end_date_setter(self, mock_user_agent, date, expected): f = CompanyFilings(cik_lookup="aapl", user_agent=mock_user_agent, filing_type=FilingType.FILING_10Q, start_date=datetime.datetime(2010, 1, 1), end_date=datetime.datetime(2015, 1, 1)) f.end_date = date assert f.end_date == date and f.params.get("dateb") == expected
def test_filing_get_urls_returns_single_list_of_urls( self, mock_cik_validator_get_multiple_ciks, mock_single_cik_filing): # Uses same response for filing links (will all be filings for aapl) f = CompanyFilings(cik_lookup=["aapl", "msft", "amzn"], filing_type=FilingType.FILING_10Q, count=5) assert all( len(f.get_urls().get(key)) == 5 for key in f.get_urls().keys())
def test_filing_save_single_cik(self, tmp_data_directory, mock_user_agent, mock_cik_validator_get_single_cik, mock_single_cik_filing, mock_filing_response): f = CompanyFilings("aapl", FilingType.FILING_10Q, user_agent=mock_user_agent, count=3) f.save(tmp_data_directory)
def test_date_is_sanitized_when_changed(self): aapl = CompanyFilings(cik_lookup="aapl", filing_type=FilingType.FILING_10Q, count=10, start_date="20150101") assert aapl.start_date == "20150101" aapl.start_date = datetime.datetime(2010, 1, 1) assert aapl.start_date == datetime.datetime(2010, 1, 1) assert aapl.params["datea"] == "20100101"
def test_filing_returns_correct_number_of_urls( self, count, mock_cik_validator_get_multiple_ciks, mock_single_cik_filing): # Uses same response for filing links (will all be filings for aapl) f = CompanyFilings(cik_lookup=["aapl", "msft", "amzn"], filing_type=FilingType.FILING_10Q, count=count, client=NetworkClient(batch_size=10)) assert all( len(f.get_urls().get(key)) == count for key in f.get_urls().keys())
def test__filter_filing_links(self, mock_user_agent, mock_single_cik_filing): f = CompanyFilings(cik_lookup="aapl", filing_type=FilingType.FILING_10Q, user_agent=mock_user_agent) data = f.client.get_soup( "", {}) # Get mock data from mock_single_cik_filing links = f._filter_filing_links(data) assert len(links) == 10 assert all(["BAD_LINK" not in link for link in links])
def test_same_urls_fetched(self, mock_user_agent, mock_single_cik_filing): # mock_single_filing_cik has more than 10 URLs # using count = 5 should help test whether the same URLs # are fetched each time f = CompanyFilings(cik_lookup="aapl", filing_type=FilingType.FILING_10Q, user_agent=mock_user_agent, count=5) first_urls = f.get_urls() second_urls = f.get_urls() assert all(f == s for f, s in zip(first_urls, second_urls))
def test_end_date_change_to_none(self, mock_user_agent): end_date = datetime.date(2020, 1, 1) f = CompanyFilings(cik_lookup="aapl", filing_type=FilingType.FILING_10Q, user_agent=mock_user_agent, end_date=end_date) assert f.end_date == end_date assert f.params["dateb"] == "20200101" f.end_date = None assert f.end_date is None assert "dateb" not in f.params
def test_count_returns_exact(self, mock_cik_validator_get_single_cik, mock_single_cik_filing): count = 10 aapl = CompanyFilings(cik_lookup="aapl", filing_type=FilingType.FILING_10Q, count=count) urls = aapl.get_urls()["aapl"] if len(urls) != count: raise AssertionError( """Count should return exact number of filings. Got {0}, but expected {1} URLs.""".format( urls, count))
def test_count_returns_exact(self, mock_user_agent, mock_cik_validator_get_single_cik, mock_single_cik_filing): count = 10 aapl = CompanyFilings(user_agent=mock_user_agent, cik_lookup="aapl", filing_type=FilingType.FILING_10Q, count=count) urls = aapl.get_urls()["aapl"] assert len( urls) == count, """Count should return exact number of filings. Got {0}, but expected {1} URLs.""".format( urls, count)
def test_good_ownership(self, mock_user_agent): shared_params = dict( cik_lookup="aapl", filing_type=FilingType.FILING_10Q, user_agent=mock_user_agent, ) f_include = CompanyFilings(**shared_params, ownership="include") f_exclude = CompanyFilings(**shared_params, ownership="exclude") assert f_include.ownership == "include" assert f_exclude.ownership == "exclude" # Change ownership type f_include.ownership = "exclude" assert f_include.ownership == "exclude"
def test_bad_start_date_setter_on_init(self, mock_user_agent, bad_start_date): with pytest.raises(TypeError): CompanyFilings(user_agent=mock_user_agent, cik_lookup="aapl", filing_type=FilingType.FILING_10Q, start_date=bad_start_date)
def test_count_setter_bad_values(self, mock_user_agent, count, expected_error): with pytest.raises(expected_error): CompanyFilings(user_agent=mock_user_agent, cik_lookup="aapl", filing_type=FilingType.FILING_10Q, count=count)
def test_filings_warning_lt_count(self, recwarn, count, raises_error, tmp_data_directory, mock_cik_validator_get_single_cik, mock_single_cik_filing_limited_responses, mock_filing_response): # noqa:E501 f = CompanyFilings(cik_lookup="aapl", filing_type=FilingType.FILING_10Q, count=count, client=NetworkClient(batch_size=10)) f.save(tmp_data_directory) if raises_error: w = recwarn.pop(UserWarning) assert issubclass(w.category, UserWarning) else: try: w = recwarn.pop(UserWarning) pytest.fail("Expected no UserWarning, but received one.") # Should raise assertion error since no UserWarning should be found except AssertionError: pass
def test_date_is_sanitized(self): start_date = datetime.datetime(2012, 3, 1) end_date = datetime.datetime(2015, 1, 1) aapl = CompanyFilings(cik_lookup="aapl", filing_type=FilingType.FILING_10Q, count=10, start_date=start_date, end_date=end_date) assert aapl.params["dateb"] == "20150101" assert aapl.params["datea"] == "20120301" assert aapl.start_date == datetime.datetime(2012, 3, 1) assert aapl.end_date == datetime.datetime(2015, 1, 1)
def test_invalid_filing_type_types(self, mock_user_agent, bad_filing_type): with pytest.raises(FilingTypeError): CompanyFilings(user_agent=mock_user_agent, cik_lookup="0000320193", filing_type=bad_filing_type)
def test_client_property_set(self, mock_user_agent): aapl = CompanyFilings( cik_lookup="aapl", filing_type=FilingType.FILING_10Q, client=NetworkClient(user_agent=mock_user_agent)) assert aapl.client.user_agent == mock_user_agent
def test_user_agent_set_to_client(self, mock_user_agent): aapl = CompanyFilings(cik_lookup="aapl", filing_type=FilingType.FILING_10Q, user_agent=mock_user_agent) assert aapl.client.user_agent == mock_user_agent
def test_user_agent_client_none(self): with pytest.raises(TypeError): _ = CompanyFilings(cik_lookup="aapl", filing_type=FilingType.FILING_10Q, user_agent=None, client=None)
def test_validate_cik_type_inside_filing(self, mock_user_agent, bad_cik_lookup): with pytest.raises(TypeError): CompanyFilings(user_agent=mock_user_agent, cik_lookup=bad_cik_lookup, filing_type=FilingType.FILING_10K)
def test_ownership(self, bad_ownership, mock_user_agent): with pytest.raises(ValueError): CompanyFilings(cik_lookup="aapl", filing_type=FilingType.FILING_10Q, user_agent=mock_user_agent, ownership=bad_ownership)