diff --git a/.travis.yml b/.travis.yml index 90cfbae89d0e9..2f2e1d3c8566d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,7 +3,9 @@ python: - "3.5" - "3.6" -install: pip install -r requirements-dev.txt +install: + - pip install -r requirements-dev.txt + - python setup.py install script: pytest diff --git a/release.py b/release.py index 85e3b28e056b8..1fafc138d7119 100644 --- a/release.py +++ b/release.py @@ -76,6 +76,30 @@ def check(): subprocess.check_call(['twine', 'check', 'dist/*']) +@cli.command() +@click.option('--annotate/--no-annotate',default=False) +@click.option('--coverage/--no-coverage',default=False) +@click.option('-v/-nv',default=False) +@click.option('-vv/-nvv',default=False) +def test(annotate,coverage,v,vv): + """ runs tests and optionally creates annotated files of coverage. """ + args = ["python3","-m","pytest","tests/"] + if coverage: + args.append("--cov=O365") + if annotate: + args.append("--cov-report") + args.append("annotate") + if v:#Verbose + args.append("-v") + if vv and not v:#Very verbose + args.append("-vv") + + env = os.environ.copy() + + p = subprocess.Popen(args,env=env) + + p.wait() + if __name__ == "__main__": cli() diff --git a/tests/test_account.py b/tests/test_account.py new file mode 100644 index 0000000000000..a91f8614a5b05 --- /dev/null +++ b/tests/test_account.py @@ -0,0 +1,16 @@ +from O365 import Account +from O365 import Message + + +class TestAccount: + + def setup_class(self): + credentials = ("client id","client secret") + self.account = Account(credentials) + + def teardown_class(self): + pass + + def test_get_message(self): + message = self.account.new_message() + assert isinstance(message,Message) diff --git a/tests/test_connection.py b/tests/test_connection.py new file mode 100644 index 0000000000000..5a9214578da27 --- /dev/null +++ b/tests/test_connection.py @@ -0,0 +1,18 @@ +import pytest +import json + +from O365.connection import Connection, Protocol, MSGraphProtocol, MSOffice365Protocol, DEFAULT_SCOPES + + +class TestConnection: + + def setup_class(self): + pass + + def teardown_class(self): + pass + + def test_blank_connection(self): + with pytest.raises(TypeError): + c1 = Connection() + diff --git a/tests/test_mailbox.py b/tests/test_mailbox.py index 864e0abfd62f4..a72b09679e97d 100644 --- a/tests/test_mailbox.py +++ b/tests/test_mailbox.py @@ -1,10 +1,31 @@ -#from O365 import Account +from O365 import Account +import json +class MockConnection: + + ret_value = None + + def get(self, url, params=None, **kwargs): + self.url = url + self.kwargs = kwargs class TestMailBox: def setup_class(self): - pass + credentials = ("client id","client secret") + self.account = Account(credentials) + self.mailbox = self.account.mailbox() + self.mailbox.con = MockConnection() def teardown_class(self): pass + + def test_mailbox(self): + assert self.mailbox.root + +# def test_get_mailbox_folders(self): +# self.mailbox.con.ret_value = ['Inbox','Drafts'] +# +# folders = self.mailbox.get_folders(limit=5) +# +# assert len(folders) > 0 diff --git a/tests/test_message.py b/tests/test_message.py index ca41e56899c38..ea35c4fa96d3a 100644 --- a/tests/test_message.py +++ b/tests/test_message.py @@ -1,5 +1,5 @@ from pathlib import Path -#from O365 import Account +from O365 import Account class TestMessage: diff --git a/tests/test_protocol.py b/tests/test_protocol.py new file mode 100644 index 0000000000000..5c1a66869f244 --- /dev/null +++ b/tests/test_protocol.py @@ -0,0 +1,74 @@ +import pytest +import json + +from pytz import UnknownTimeZoneError +from tzlocal import get_localzone + +from O365.connection import Connection, Protocol, MSGraphProtocol, MSOffice365Protocol, DEFAULT_SCOPES + +TEST_SCOPES = ['Contacts.Read.Shared', 'Mail.Send.Shared', 'User.Read', 'Contacts.ReadWrite.Shared', 'Mail.ReadWrite.Shared', 'Mail.Read.Shared', 'Contacts.Read', 'Sites.ReadWrite.All', 'Mail.Send', 'Mail.ReadWrite', 'offline_access', 'Mail.Read', 'Contacts.ReadWrite', 'Files.ReadWrite.All', 'Calendars.ReadWrite', 'User.ReadBasic.All'] + +class TestProtocol: + + def setup_class(self): + self.proto = Protocol(protocol_url="testing", api_version="0.0") + + def teardown_class(self): + pass + + def test_blank_protocol(self): + with pytest.raises(ValueError): + p = Protocol() + + def test_to_api_case(self): + assert(self.proto.to_api_case("CaseTest") == "case_test") + + def test_get_scopes_for(self): + with pytest.raises(ValueError): + self.proto.get_scopes_for(123) # should error sicne it's not a list or tuple. + + assert(self.proto.get_scopes_for(['mailbox']) == ['mailbox']) + + assert(self.proto.get_scopes_for(None) == []) + + assert(self.proto.get_scopes_for('mailbox') == ['mailbox']) + + self.proto._oauth_scopes = DEFAULT_SCOPES + + assert(self.proto.get_scopes_for(['mailbox']) == ['Mail.Read']) + + # This test verifies that the scopes in the default list don't change + #without us noticing. It makes sure that all the scopes we get back are + #in the current set of scopes we expect. And all the scopes that we are + #expecting are in the scopes we are getting back. The list contains the + #same stuff but may not be in the same order and are therefore not equal + scopes = self.proto.get_scopes_for(None) + for scope in scopes: + assert(scope in TEST_SCOPES) + for scope in TEST_SCOPES: + assert(scope in scopes) + + assert(self.proto.get_scopes_for('mailbox') == ['Mail.Read']) + + def test_prefix_scope(self): + assert(self.proto._prefix_scope('Mail.Read') == 'Mail.Read') + + assert(self.proto._prefix_scope(('Mail.Read',)) == 'Mail.Read') + + self.proto.protocol_scope_prefix = 'test_prefix_' + + assert(self.proto._prefix_scope(('Mail.Read',)) == 'Mail.Read') + + assert(self.proto._prefix_scope('test_prefix_Mail.Read') == 'test_prefix_Mail.Read') + + assert(self.proto._prefix_scope('Mail.Read') == 'test_prefix_Mail.Read') + + def test_decendant_MSOffice365Protocol(self): + # Basically we just test that it can create the class w/o erroring. + msp = MSOffice365Protocol() + + # Make sure these don't change without going noticed. + assert(msp.keyword_data_store['message_type'] == 'Microsoft.OutlookServices.Message') + assert(msp.keyword_data_store['file_attachment_type'] == '#Microsoft.OutlookServices.FileAttachment') + assert(msp.keyword_data_store['item_attachment_type'] == '#Microsoft.OutlookServices.ItemAttachment') + assert(msp.max_top_value == 999)