def test_should_contain1(self):
        self.expect_xml_http("""
        <CFRDOC>
            <AMDDATE>Jan 1, 2001</AMDDATE>
            <PARTS>Part 111 to 222</PARTS>
        </CFRDOC>""")

        volume = annual.Volume(2001, 12, 2)
        self.assertFalse(volume.should_contain(1))
        self.assertFalse(volume.should_contain(100))
        self.assertFalse(volume.should_contain(300))
        self.assertFalse(volume.should_contain(250))
        self.assertTrue(volume.should_contain(111))
        self.assertTrue(volume.should_contain(211))
        self.assertTrue(volume.should_contain(222))

        self.expect_xml_http("""
        <CFRDOC>
            <AMDDATE>Jan 1, 2001</AMDDATE>
            <PARTS>Parts 587 to End</PARTS>
        </CFRDOC>""")

        volume = annual.Volume(2001, 12, 2)
        self.assertFalse(volume.should_contain(111))
        self.assertFalse(volume.should_contain(586))
        self.assertTrue(volume.should_contain(587))
        self.assertTrue(volume.should_contain(600))
        self.assertTrue(volume.should_contain(999999))
    def test_should_contain1(self, requests):
        response = Response()
        response.status_code = 200
        response._content = """
        <CFRDOC>
            <AMDDATE>Jan 1, 2001</AMDDATE>
            <PARTS>Part 111 to 222</PARTS>
        </CFRDOC>"""
        response._content_consumed = True
        requests.get.return_value = response

        volume = annual.Volume(2001, 12, 2)
        self.assertFalse(volume.should_contain(1))
        self.assertFalse(volume.should_contain(100))
        self.assertFalse(volume.should_contain(300))
        self.assertFalse(volume.should_contain(250))
        self.assertTrue(volume.should_contain(111))
        self.assertTrue(volume.should_contain(211))
        self.assertTrue(volume.should_contain(222))

        response._content = """
        <CFRDOC>
            <AMDDATE>Jan 1, 2001</AMDDATE>
            <PARTS>Parts 587 to End</PARTS>
        </CFRDOC>"""
        response._content_consumed = True

        volume = annual.Volume(2001, 12, 2)
        self.assertFalse(volume.should_contain(111))
        self.assertFalse(volume.should_contain(586))
        self.assertTrue(volume.should_contain(587))
        self.assertTrue(volume.should_contain(600))
        self.assertTrue(volume.should_contain(999999))
    def test_init(self):
        uri = re.compile(r'.*gpo.gov.*1010.*12.*4.*xml')
        self.expect_xml_http(uri=uri)
        volume = annual.Volume(1010, 12, 4)
        self.assertEqual(True, volume.exists)

        self.expect_xml_http(status=404, uri=uri)
        volume = annual.Volume(1010, 12, 4)
        self.assertEqual(False, volume.exists)
    def test_init(self, requests):
        response = Response()
        response.status_code = 200
        requests.get.return_value = response
        volume = annual.Volume(1010, 12, 4)
        self.assertEqual(True, volume.exists)

        response.status_code = 404
        volume = annual.Volume(1010, 12, 4)
        self.assertEqual(False, volume.exists)

        self.assertTrue('1010' in requests.get.call_args[0][0])
        self.assertTrue('12' in requests.get.call_args[0][0])
        self.assertTrue('4' in requests.get.call_args[0][0])
    def test_should_contain_with_single_part(self):
        self.expect_xml_http("""
                <CFRDOC>
                    <AMDDATE>Jan 1, 2001</AMDDATE>
                    <PARTS>Part 641 (§§ 641.1 to 641.599)</PARTS>
                </CFRDOC>""")

        volume = annual.Volume(2001, 12, 2)
        self.assertFalse(volume.should_contain(640))
        self.assertTrue(volume.should_contain(641))
        self.assertFalse(volume.should_contain(642))
    def test_should_contain2(self, requests):
        pt111 = """
                    <PART>
                        <EAR>Pt. 111</EAR>
                        <HD SOURCE="HED">PART 111-Something</HD>
                        <FIELD>111 Content</FIELD>
                    </PART>
                """
        pt112 = """
                    <PART>
                        <EAR>Pt. 112</EAR>
                        <HD SOURCE="HED">PART 112-Something</HD>
                        <FIELD>112 Content</FIELD>
                    </PART>
                """

        def side_effect(url, stream=False):
            response = Response()
            response.status_code = 200
            response._content_consumed = True
            if 'bulkdata' in url:
                response._content = """
                <CFRDOC>
                    <AMDDATE>Jan 1, 2001</AMDDATE>
                    <PARTS>Part 111 to 222</PARTS>
                    %s
                    %s
                </CFRDOC>""" % (pt111, pt112)
            elif url.endswith('part111.xml'):
                response._content = pt111
            elif url.endswith('part112.xml'):
                response._content = pt112
            else:
                response.status_code = 404
            return response

        requests.get.side_effect = side_effect

        volume = annual.Volume(2001, 12, 2)

        xml = volume.find_part_xml(111)
        self.assertEqual(len(xml.xpath('./EAR')), 1)
        self.assertEqual(xml.xpath('./EAR')[0].text, 'Pt. 111')
        self.assertEqual(len(xml.xpath('./FIELD')), 1)
        self.assertEqual(xml.xpath('./FIELD')[0].text, '111 Content')

        xml = volume.find_part_xml(112)
        self.assertEqual(len(xml.xpath('./EAR')), 1)
        self.assertEqual(xml.xpath('./EAR')[0].text, 'Pt. 112')
        self.assertEqual(len(xml.xpath('./FIELD')), 1)
        self.assertEqual(xml.xpath('./FIELD')[0].text, '112 Content')

        self.assertEqual(volume.find_part_xml(113), None)
    def test_find_part_local(self):
        """Verify that a local copy of the annual edition content is
        checked"""
        with CliRunner().isolated_filesystem():
            path = os.path.join(xml_sync.GIT_DIR, 'annual')
            os.makedirs(path)
            path = os.path.join(path, 'CFR-2020-title11-vol12-part13.xml')
            with open(path, 'w') as f:
                f.write('<ROOT><CHILD>content</CHILD></ROOT>')

            xml = annual.Volume(2020, 11, 12).find_part_xml(13)
            self.assertEqual(xml.xpath('./CHILD')[0].text,
                             'content')
    def test_should_contain__empty_volume(self):
        """If the first volume does not contain a PARTS tag, we should assume
        that it covers all of the regs in this title"""
        self.expect_xml_http("""
        <CFRDOC>
            <SOMETHINGELSE>Here</SOMETHINGELSE>
        </CFRDOC>
        """, uri=re.compile(r".*bulkdata.*"))

        volume = annual.Volume(2001, 12, 1)
        self.assertTrue(volume.should_contain(1))
        self.assertTrue(volume.should_contain(10))
        self.assertTrue(volume.should_contain(100))
        self.assertTrue(volume.should_contain(1000))
    def test_find_part_local(self, http_client):
        """Verify that a local copy of the annual edition content is
        checked"""
        http_client.return_value.get.return_value.status_code = 200
        http_client.return_value.get.return_value.content = b"""
        <PART>
            <EAR>Pt. 111</EAR>
            <HD SOURCE="HED">PART 111-Something</HD>
            <FIELD>111 Content</FIELD>
        </PART>"""
        volume = annual.Volume(2001, 12, 1)

        volume.find_part_xml(111)
        assert http_client.return_value.get.call_count == 1

        http_client.return_value.get.return_value.status_code = 404
        volume.find_part_xml(111)
        assert http_client.return_value.get.call_count == 3
    def test_should_contain2(self):
        pt111 = """
        <PART>
            <EAR>Pt. 111</EAR>
            <HD SOURCE="HED">PART 111-Something</HD>
            <FIELD>111 Content</FIELD>
        </PART>"""
        pt112 = """
        <PART>
            <EAR>Pt. 112</EAR>
            <HD SOURCE="HED">PART 112-Something</HD>
            <FIELD>112 Content</FIELD>
        </PART>"""

        self.expect_xml_http(pt111, uri=re.compile(r".*part111\.xml"))
        self.expect_xml_http(pt112, uri=re.compile(r".*part112\.xml"))
        self.expect_xml_http(status=404, uri=re.compile(r".*part113\.xml"))
        self.expect_xml_http("""
        <CFRDOC>
            <AMDDATE>Jan 1, 2001</AMDDATE>
            <PARTS>Part 111 to 222</PARTS>
            %s
            %s
        </CFRDOC>""" % (pt111, pt112),
                             uri=re.compile(r".*bulkdata.*"))

        volume = annual.Volume(2001, 12, 2)

        xml = volume.find_part_xml(111)
        self.assertEqual(len(xml.xpath('./EAR')), 1)
        self.assertEqual(xml.xpath('./EAR')[0].text, 'Pt. 111')
        self.assertEqual(len(xml.xpath('./FIELD')), 1)
        self.assertEqual(xml.xpath('./FIELD')[0].text, '111 Content')

        xml = volume.find_part_xml(112)
        self.assertEqual(len(xml.xpath('./EAR')), 1)
        self.assertEqual(xml.xpath('./EAR')[0].text, 'Pt. 112')
        self.assertEqual(len(xml.xpath('./FIELD')), 1)
        self.assertEqual(xml.xpath('./FIELD')[0].text, '112 Content')

        self.assertEqual(volume.find_part_xml(113), None)