Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cassette recording failure for tests which extend setUpClass #186

Open
FriedrichFroebel opened this issue Jun 19, 2022 · 1 comment
Open

Comments

@FriedrichFroebel
Copy link
Collaborator

FriedrichFroebel commented Jun 19, 2022

Recording a new cassette for the following test fails inside tests.test_trackable.TestMethods (for #185):

    def test_load__type(self):
        with self.subTest("existing"):
            trackable = Trackable(self.gc, "TB1KEZ9")
            with self.recorder.use_cassette("trackable_load__existing_type"):
                self.assertEqual("SwedenHawk Geocoin", trackable.type)

        with self.subTest("missing"):
            trackable = Trackable(self.gc, "TB7WZD9")
            with self.recorder.use_cassette("trackable_load__missing_type"):
                self.assertEqual(None, trackable.type)

The errors are (running pytest -k "test_load__type" --log-level DEBUG for example):

=============================================================================== FAILURES ================================================================================
______________________________________________________________________ TestMethods.test_load__type ______________________________________________________________________

args = (<pycaching.trackable.Trackable object at 0x7f71f85f8cd0>,), kwargs = {}, self = <pycaching.trackable.Trackable object at 0x7f71f85f8cd0>

    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        self = args[0]
        try:
>           return func(*args, **kwargs)

pycaching/util.py:30: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <pycaching.trackable.Trackable object at 0x7f71f85f8cd0>

    @property
    @lazy_loaded
    def type(self):
        """The trackable type.
    
        A type depends on the trackable icon. It can be either "Travel Bug Dog Tag" or specific
            geocoin name, eg. "Adventure Race Hracholusky 2015 Geocoin".
    
        :type: :class:`str`
        """
>       return self._type
E       AttributeError: 'Trackable' object has no attribute '_type'

pycaching/trackable.py:152: AttributeError

During handling of the above exception, another exception occurred:

self = <test.test_trackable.TestMethods testMethod=test_load__type>

    def test_load__type(self):
        with self.subTest("existing"):
            trackable = Trackable(self.gc, "TB1KEZ9")
            with self.recorder.use_cassette("trackable_load__existing_type"):
>               self.assertEqual("SwedenHawk Geocoin", trackable.type)

test/test_trackable.py:92: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
pycaching/util.py:33: in wrapper
    self.load()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <pycaching.trackable.Trackable object at 0x7f71f85f8cd0>

    def load(self):
        """Load all possible details about the trackable.
    
        .. note::
           This method is called automatically when you access a property which isn't yet filled in
           (so-called "lazy loading"). You don't have to call it explicitly.
    
        :raise .LoadError: If trackable loading fails (probably because of not existing trackable).
        """
        # pick url based on what info we have right now
        if hasattr(self, "url"):
            url = self.url
        elif hasattr(self, "_tid"):
            url = "track/details.aspx?tracker={}".format(self._tid)
        else:
            raise errors.LoadError("Trackable lacks info for loading")
    
        # make request
        root = self.geocaching._request(url)
    
        # parse data
        self.tid = root.find("span", "CoordInfoCode").text
        self.name = root.find(id="ctl00_ContentBody_lbHeading").text
        self.type = root.find(id="ctl00_ContentBody_BugTypeImage").get("alt")
        self.owner = root.find(id="ctl00_ContentBody_BugDetails_BugOwner").text
        self.goal = root.find(id="TrackableGoal").text
        self.description = root.find(id="TrackableDetails").text
>       self._kml_url = root.find(id="ctl00_ContentBody_lnkGoogleKML").get("href")
E       AttributeError: 'NoneType' object has no attribute 'get'

pycaching/trackable.py:196: AttributeError

Debugging this yields the result that the login is successful, but the trackable page is rendered as logged-out user, thus not containing the KML data.

Disabling the setup cassette loader in this class seems to fix this issue, although it is now clear to me why:

    @classmethod
    def setUpClass(cls):
        super().setUpClass()
        cls.t = Trackable(cls.gc, "TB1KEZ9")
        # with cls.recorder.use_cassette("trackable_setup"):
        #     cls.t.load()

We should do some more investigation on what actually causes this issue/side effect and fix it.

@FriedrichFroebel
Copy link
Collaborator Author

This does not seem to be limited to the trackable cassette, but occurred for test.test_cache.TestMethods as well, which has a similar setUpClass overwrite.

@FriedrichFroebel FriedrichFroebel changed the title Cassette recording failure for tests.test_trackable.TestMethods Cassette recording failure for tests which extend setUpClass Aug 22, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant