def setUp(self):
     self.resolver = FinditResolver()
     self.qdct = QueryDict( '', mutable=True )
class FinditResolverTest( TestCase ):
    """ Checks FinditResolver() functions. """

    def setUp(self):
        self.resolver = FinditResolver()
        self.qdct = QueryDict( '', mutable=True )

    ########################################
    ## check_double_encoded_querystring() ##

    def test__check_double_encoded_querystring__good_string(self):
        """ For good string, the bad-check sould be false. """
        s = 'ctx_ver=Z39.88-2004&ctx_enc=info%3Aofi%2Fenc%3AUTF-8&rfr_id=info%3Asid%2Fsummon.serialssolutions.com&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&rft.genre=article&rft.atitle=Finance-dominated+capitalism+and+re-distribution+of+income%3A+a+Kaleckian+perspective&rft.jtitle=Cambridge+Journal+of+Economics&rft.au=Hein%2C+E&rft.date=2015-05-01&rft.issn=0309-166X&rft.eissn=1464-3545&rft.volume=39&rft.issue=3&rft.spage=907&rft.epage=934&rft_id=info:doi/10.1093%2Fcje%2Fbet038&rft.externalDBID=n%2Fa&rft.externalDocID=10_1093_cje_bet038'
        self.assertEqual(
            False,
            self.resolver.check_double_encoded_querystring( s )
            )
        self.assertEqual(
            '',
            self.resolver.redirect_url
            )

    def test__check_double_encoded_querystring__double_encoded_string(self):
        """ For double-encoded string, the bad-check sould be true. """
        s = 'ctx_ver=Z39.88-2004&ctx_enc=info%253Aofi%252Fenc%253AUTF-8&rfr_id=info%253Asid%252Fsummon.serialssolutions.com&rft_val_fmt=info%253Aofi%252Ffmt%253Akev%253Amtx%253Ajournal&rft.genre=article&rft.atitle=Finance-dominated+capitalism+and+re-distribution+of+income%253A+a+Kaleckian+perspective&rft.jtitle=Cambridge+Journal+of+Economics&rft.au=Hein%252C+E&rft.date=2015-05-01&rft.issn=0309-166X&rft.eissn=1464-3545&rft.volume=39&rft.issue=3&rft.spage=907&rft.epage=934&rft_id=info:doi/10.1093%252Fcje%252Fbet038&rft.externalDBID=n%252Fa&rft.externalDocID=10_1093_cje_bet038'
        self.assertEqual(
            True,
            self.resolver.check_double_encoded_querystring( s )
            )
        self.assertEqual(
            '/find/?ctx_ver=Z39.88-2004&ctx_enc=info%3Aofi%2Fenc%3AUTF-8&rfr_id=info%3Asid%2Fsummon.serialssolutions.com&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&rft.genre=article&rft.atitle=Finance-dominated+capitalism+and+re-distribution+of+income%3A+a+Kaleckian+perspective&rft.jtitle=Cambridge+Journal+of+Economics&rft.au=Hein%2C+E&rft.date=2015-05-01&rft.issn=0309-166X&rft.eissn=1464-3545&rft.volume=39&rft.issue=3&rft.spage=907&rft.epage=934&rft_id=info:doi/10.1093%2Fcje%2Fbet038&rft.externalDBID=n%2Fa&rft.externalDocID=10_1093_cje_bet038',
            self.resolver.redirect_url
            )

    def test__check_double_encoded_querystring__non_double_encoded_with_embedded_25(self):
        """ For non double-encoded string with an embedded 25, the string can return true, but should be handled fine. """
        s = 'ctx_ver=Z39.88-2004&ctx_enc=info%3Aofi%2Fenc%3AUTF-8&rfr_id=info%3Asid%2Fsummon.serialssolutions.com&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&rft.genre=article&rft.atitle=Examination+of+breakdown+stress+in+creep+by+viscous+glide+in+Al–5·5+at.-%25Mg+solid+solution+alloy+at+high+stress+levels&rft.jtitle=Materials+Science+and+Technology&rft.au=Graiss%2C+G&rft.au=El-Rehim%2C+A.+F.+Abd&rft.date=2007-10-01&rft.issn=0267-0836&rft.eissn=1743-2847&rft.volume=23&rft.issue=10&rft.spage=1144&rft.epage=1148&rft_id=info:doi/10.1179%2F174328407X226545&rft.externalDBID=n%2Fa&rft.externalDocID=10_1179_174328407X226545'
        self.assertEqual(
            True,
            self.resolver.check_double_encoded_querystring( s )
            )
        self.assertEqual(
            '/find/?ctx_ver=Z39.88-2004&ctx_enc=info:ofi/enc:UTF-8&rfr_id=info:sid/summon.serialssolutions.com&rft_val_fmt=info:ofi/fmt:kev:mtx:journal&rft.genre=article&rft.atitle=Examination+of+breakdown+stress+in+creep+by+viscous+glide+in+Al\u20135\xb75+at.-%Mg+solid+solution+alloy+at+high+stress+levels&rft.jtitle=Materials+Science+and+Technology&rft.au=Graiss,+G&rft.au=El-Rehim,+A.+F.+Abd&rft.date=2007-10-01&rft.issn=0267-0836&rft.eissn=1743-2847&rft.volume=23&rft.issue=10&rft.spage=1144&rft.epage=1148&rft_id=info:doi/10.1179/174328407X226545&rft.externalDBID=n/a&rft.externalDocID=10_1179_174328407X226545',
            self.resolver.redirect_url
            )

    #########################
    ## check_direct_link() ##

    def test_check_direct_link__none( self ):
        """ No direct link should return False. """
        sersol_dct = {
            u'dbDate': None,
            u'diagnostics': [ {
                u'details': u'Not enough metadata supplied. We require a title or valid DOI, PMID, or ISSN.',
                u'message': u'Not enough metadata supplied',
                u'uri': u'sersol/diagnostics/8'} ],
            u'echoedQuery': {
                u'library': {u'id': None, u'name': None},
                u'queryString': u'version=1.0&url_ver=Z39.88-2004&isbn=123',
                u'timeStamp': u'2016-03-24T15:22:31' },
            u'results': [],
            u'version': u'1.0'
            }
        self.assertEqual(
            False,  self.resolver.check_direct_link( sersol_dct )
            )
        self.assertEqual(
            False,  self.resolver.direct_link
            )

    def test_check_direct_link__two_available( self ):
        """ Multiple direct links should return True, and set the the direct_link attribute the first article url. """
        sersol_dct = {
            u'dbDate': None,
            u'diagnostics': [ {
                u'details': u'Not enough metadata supplied. We require a title or valid DOI, PMID, or ISSN.',
                u'message': u'Not enough metadata supplied',
                u'uri': u'sersol/diagnostics/8'} ],
            u'echoedQuery': {
                u'library': {u'id': None, u'name': None},
                u'queryString': u'version=1.0&url_ver=Z39.88-2004&isbn=123',
                u'timeStamp': u'2016-03-24T15:22:31' },
            u'results': [ {
                u'linkGroups': [
                        {
                            u'holdingData': {
                                u'databaseId': u'WIK',
                                u'databaseName': u'Wiley-Blackwell Science, Technology and Medicine Collection',
                                u'providerId': u'PRVWIB',
                                u'providerName': u'Wiley-Blackwell',
                                u'startDate': u'1969-01-01'},
                            u'type': u'holding',
                            u'url': {
                                u'article': u'https://login.revproxy.brown.edu/login?url=http://doi.wiley.com/10.1111/j.1095-8312.2011.01617.x',
                                u'issue': u'https://login.revproxy.brown.edu/login?url=http://onlinelibrary.wiley.com/resolve/openurl?genre=issue&eissn=1095-8312&volume=102&issue=4',
                                u'journal': u'https://login.revproxy.brown.edu/login?url=http://onlinelibrary.wiley.com/journal/10.1111/(ISSN)1095-8312',
                                u'source': u'https://login.revproxy.brown.edu/login?url=http://onlinelibrary.wiley.com.revproxy.brown.edu/journal/10.1107/S20532296'}},
                        {
                            u'holdingData': {
                                u'databaseId': u'EAP',
                                u'databaseName': u'Academic Search Premier',
                                u'endDate': u'2015-03-30',
                                u'providerId': u'PRVEBS',
                                u'providerName': u'EBSCOhost',
                                u'startDate': u'2003-01-01'},
                            u'type': u'holding',
                            u'url': {
                                u'article': u'https://login.revproxy.brown.edu/login?url=http://openurl.ebscohost.com/linksvc/linking.aspx?genre=article&issn=0024-4066&date=2011&volume=102&issue=4&spage=715&atitle=Phylogeny+and+divergence+time+of+island+tiger+beetles+of+the+genus+Cylindera+in+East+Asia+PHYLOGENY+OF+TIGER+BEETLES+IN+EAST+ASIA&aulast=SOTA&aufirst=TEIJI',
                                u'journal': u'https://login.revproxy.brown.edu/login?url=http://search.ebscohost.com/direct.asp?db=aph&jid=JT0&scope=site',
                                u'source': u'https://login.revproxy.brown.edu/login?url=http://search.ebscohost.com/direct.asp?db=aph'}}
                        ]
                    }
                ],
            u'version': u'1.0'
            }
        self.assertEqual(
            True,  self.resolver.check_direct_link( sersol_dct )
            )
        self.assertEqual(
            'https://login.revproxy.brown.edu/login?url=http://doi.wiley.com/10.1111/j.1095-8312.2011.01617.x',
            self.resolver.direct_link
            )

    ###################
    ## check_ebook() ##

    def test_check_ebook_no(self):
        """ Checks for proper response when _no_ ebook is found. """
        sersol_dct = {
            u'dbDate': None,
            u'diagnostics': [ {
                u'details': u'Not enough metadata supplied. We require a title or valid DOI, PMID, or ISSN.',
                u'message': u'Not enough metadata supplied',
                u'uri': u'sersol/diagnostics/8'} ],
            u'echoedQuery': {
                u'library': {u'id': None, u'name': None},
                u'queryString': u'version=1.0&url_ver=Z39.88-2004&isbn=123',
                u'timeStamp': u'2016-03-24T15:22:31' },
            u'results': [],
            u'version': u'1.0'
            }
        self.assertEqual(
            ( False, u'', u'') ,  # ( ebook_exists, label, url )
            self.resolver.check_ebook( sersol_dct )
            )

    def test_check_ebook_yes(self):
        """ Checks for proper response when ebook _is_ found. """
        sersol_dct = {
            u'dbDate': u'2016-03-24',
            u'echoedQuery': {
                u'library': {u'id': u'RL3TP7ZF5X', u'name': u'Brown University'},
                u'queryString': u'version=1.0&url_ver=Z39.88-2004&sid=FirstSearch%3AWorldCat&genre=book&title=Zen&date=1978&aulast=Yoshioka&aufirst=T%C5%8Dichi&id=doi%3A&pid=6104671%3Cfssessid%3E0%3C%2Ffssessid%3E%3Cedition%3E1st+ed.%3C%2Fedition%3E&url_ver=Z39.88-2004&rfr_id=info%3Asid%2Ffirstsearch.oclc.org%3AWorldCat&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&rft.genre=book&req_dat=%3Csessionid%3E0%3C%2Fsessionid%3E&rfe_dat=%3Caccessionnumber%3E6104671%3C%2Faccessionnumber%3E&rft_id=info%3Aoclcnum%2F6104671&rft.aulast=Yoshioka&rft.aufirst=T%C5%8Dichi&rft.btitle=Zen&rft.date=1978&rft.place=Osaka++Japan&rft.pub=Hoikusha&rft.edition=1st+ed.&rft.genre=book',
                u'timeStamp': u'2016-03-24T15:32:03' },
            u'results': [ {
                u'citation': {
                    u'creator': u'Yoshioka, T\u014dichi',
                    u'creatorFirst': u'T\u014dichi',
                    u'creatorLast': u'Yoshioka',
                    u'date': u'1978',
                    u'publicationPlace': u'Osaka  Japan',
                    u'publisher': u'Hoikusha',
                    u'source': u'Zen : the religion of the samurai : a study of Zen philosophy and discipline in China and Japan',
                    u'title': u'Zen' },
                u'format': u'book',
                u'linkGroups': [ {
                    u'holdingData': {
                        u'databaseId': u'-VX',
                        u'databaseName': u'eBook Academic Subscription Collection - North America',
                        u'providerId': u'PRVEBS',
                        u'providerName': u'EBSCOhost' },
                    u'type': u'holding',
                    u'url': {
                        u'journal': u'https://login.revproxy.brown.edu/login?url=http://search.ebscohost.com/login.aspx?direct=true&scope=site&db=e000xna&AN=313762',
                        u'source': u'https://login.revproxy.brown.edu/login?url=http://search.ebscohost.com/login.aspx?authtype=ip,uid&profile=ehost&defaultdb=e000xna' }
                    } ]
                } ],
            u'version': u'1.0'
            }
        self.assertEqual(
            ## ( ebook_exists, label, url )
            (True, u'eBook Academic Subscription Collection - North America', u'https://login.revproxy.brown.edu/login?url=http://search.ebscohost.com/login.aspx?direct=true&scope=site&db=e000xna&AN=313762'),
            self.resolver.check_ebook( sersol_dct )
            )

    ###########################
    ## check_pubmed_result() ##

    def test_check_pubmed_result__pubmed_a(self):
        """ Tests one style of pubmed info -- no change needed """
        sersol_dct = {
            'results': [ {
                'citation': {'pmid': 'foo', 'volume': 'bar'},
                'format': 'journal'
                } ]
            }
        self.assertEqual( sersol_dct, self.resolver.check_pubmed_result(sersol_dct) )

    def test_check_pubmed_result__pubmed_b(self):
        """ Tests second style of pubmed info -- format should be `journal` """
        sersol_dct = {
            'results': [ {
                'citation': {'pmid': 'foo', 'volume': 'bar'},
                'format': 'book'
                } ]
            }
        expected_result = {
            u'results': [ {
                'citation': {'pmid': 'foo', 'volume': 'bar'},
                'format': u'journal'}
                ] }
        self.assertEqual( expected_result, self.resolver.check_pubmed_result(sersol_dct) )

    ######################
    ## check_bad_data() ##

    def test_check_bad_data__good_data(self):
        """ Good sersol_dct should return (False, no-redirect-url, no-message) for (check-boolean, redirect-url-string, message) """
        querystring = 'foo=bar'
        sersol_dct = {}
        ( is_bad_data, redirect_url, problem_message ) = self.resolver.check_bad_data( querystring, sersol_dct )
        self.assertEqual( (False, None, None), (is_bad_data, redirect_url, problem_message) )

    def test_check_bad_data__incomplete_data(self):
        """ sersol_dct indicating not-enough-metadata should return (True, a redirect-url, appropriate-message) """
        querystring = 'foo=bar'
        sersol_dct = {
            'diagnostics': [ {
                'message': 'Not enough metadata supplied'
                } ] }
        ( is_bad_data, redirect_url, problem_message ) = self.resolver.check_bad_data( querystring, sersol_dct )
        ( is_bad_data, redirect_url, problem_message ) = self.resolver.check_bad_data( querystring, sersol_dct )
        self.assertEqual( (True, '/find/citation_form/?foo=bar'), (is_bad_data, redirect_url) )
        self.assertTrue( 'not enough information provided' in problem_message )

    def test_check_bad_data__bad_data(self):
        """ sersol_dct indicating not-enough-metadata should return (True, a redirect-url, appropriate-message) """
        querystring = 'foo=bar'
        sersol_dct = {
            'diagnostics': [ {
                'message': 'Invalid syntax'
                } ] }
        ( is_bad_data, redirect_url, problem_message ) = self.resolver.check_bad_data( querystring, sersol_dct )
        self.assertEqual( (True, '/find/citation_form/?foo=bar'), (is_bad_data, redirect_url) )
        self.assertTrue( 'confirm the information' in problem_message )