Projekt

Obecné

Profil

« Předchozí | Další » 

Revize fc874c36

Přidáno uživatelem Michal Seják před asi 4 roky(ů)

Re #8572 - Added tests for certificate deletion.

Zobrazit rozdíly:

tests/integration_tests/rest_api/certificates_test.py
311 311

  
312 312
def test_sign_by_non_ca(server):
313 313
    ret = make_end_cert(server, 2, "Fake intermediate cert s.r.o.", usage={
314
            "CA": False,
315
            "SSL": True,
316
            "authentication": True,
317
            "digitalSignature": True
318
        })
314
        "CA": False,
315
        "SSL": True,
316
        "authentication": True,
317
        "digitalSignature": True
318
    })
319 319

  
320 320
    assert ret.status_code == 201
321 321

  
......
327 327
    assert d["success"]
328 328

  
329 329
    ret = make_end_cert(server, 8, "End certificate signed by end certificate s.r.o.", usage={
330
            "CA": False,
331
            "SSL": True,
332
            "authentication": False,
333
            "digitalSignature": False
334
        })
330
        "CA": False,
331
        "SSL": True,
332
        "authentication": False,
333
        "digitalSignature": False
334
    })
335 335

  
336 336
    # TODO discussion -> assert ret.status_code == 400
337 337
    assert ret.status_code == 201
......
592 592
        assert not ret.json["success"]
593 593
        assert "No such certificate found." == ret.json["data"]
594 594

  
595

  
595 596
def test_set_certificate_status(server):
596 597
    # Create certificate to be revoked later
597 598
    certificate = {
......
624 625

  
625 626
    # revoke the certificate
626 627
    revocation_body = {
627
        "status":  "revoked",
628
        "status": "revoked",
628 629
        "reason": "keyCompromise"
629 630
    }
630 631
    revoke_ret = server.patch(f"/api/certificates/{cert_id}", content_type="application/json", json=revocation_body)
......
643 644

  
644 645
    # set to valid again
645 646
    valid_body = {
646
        "status":  "valid"
647
        "status": "valid"
647 648
    }
648 649
    valid_ret = server.patch(f"/api/certificates/{cert_id}", content_type="application/json", json=valid_body)
649 650

  
......
698 699
    assert "data" in revoke_ret.json
699 700
    assert "success" in revoke_ret.json
700 701
    assert not revoke_ret.json["success"]
702

  
703

  
704
def test_certificate_deletion(server):
705

  
706
    # custom tree for checking node bijection w/ the actual certificate tree
707
    all_certs = {}
708
    parent_of = {}
709

  
710
    ret = make_root_ca(server)
711
    assert ret.json["success"]
712
    root_id = ret.json["data"]
713
    all_certs[root_id] = []
714

  
715
    def add(add_fn, parent):
716
        """
717
        Add a node to the global tree (represented by `all_certs` and `parent_of`).
718
        :param add_fn: node type
719
        :param parent: parent node id
720
        :return: new node id
721
        """
722
        json = add_fn(server, parent).json
723
        assert json["success"]
724
        new_id = json["data"]
725
        all_certs[parent].append(new_id)
726
        all_certs[new_id] = []
727
        parent_of[new_id] = parent
728
        return new_id
729

  
730
    def remove(id):
731
        """
732
        Remove a node from the global tree (represented by `all_certs` and `parent_of`).
733
        :param id:
734
        :return:
735
        """
736
        removed = []
737

  
738
        def dfs(t):
739
            removed.append(t)
740
            for child in all_certs[t]:
741
                dfs(child)
742
            del all_certs[t]
743

  
744
        dfs(id)
745
        if id != root_id:
746
            all_certs[parent_of[id]].remove(id)
747
        return removed
748

  
749
    # create a chain of certificates
750
    for i in range(10):
751
        add(make_inter_ca, root_id + i)
752

  
753
    # create a branch from the middle
754
    last = add(make_inter_ca, root_id + 5)
755

  
756
    for i in range(5):
757
        add(make_inter_ca, last + i)
758

  
759
    # add end certificates for bonus spice
760
    add(make_end_cert, root_id + 10)
761
    add(make_end_cert, root_id + 9)
762
    last_end_id = add(make_end_cert, root_id + 16)
763

  
764
    # check that all certificates were created successfully
765
    assert last_end_id == root_id + 19
766

  
767
    # for four pseudorandom nodes in the created tree (descending order, a is not an ancestor of b if a > b)
768
    for target in (root_id + 14, root_id + 10, root_id + 3, root_id):
769
        # try delete
770
        ret = server.delete(f"/api/certificates/{target}")
771
        assert ret.status_code == 200
772
        json = ret.json
773
        assert "data" in json
774
        assert "success" in json
775
        assert json["success"]
776

  
777
        # for everything that should be removed
778
        currently_removed = remove(target)
779
        for cert_id in currently_removed:
780
            # check if it actually is
781
            ret = server.delete(f"/api/certificates/{cert_id}")
782
            assert ret.status_code == 404
783
            json = ret.json
784
            assert "data" in json
785
            assert "success" in json
786
            assert not json["success"]
787

  
788
            # twice, just in case
789
            ret = server.get(f"/api/certificates/{cert_id}")
790
            assert ret.status_code == 205   # TODO change to 404 after someone gets the issue assigned and resolves it
791
            json = ret.json
792
            assert "data" in json
793
            assert "success" in json
794
            assert not json["success"]
795

  
796
        # for everything that should not be removed
797
        for cert_id in all_certs:
798
            # check that it exists
799
            ret = server.get(f"/api/certificates/{cert_id}")
800
            assert ret.status_code == 200
801
            json = ret.json
802
            assert "data" in json
803
            assert "success" in json
804
            assert json["success"]
805

  
806

  
807
def test_certificate_deletion_invalid_params_1(server):
808
    ret = server.delete("/api/certificates/120938")
809
    assert ret.status_code == 404
810
    assert not ret.json["success"]
811

  
812

  
813
def test_certificate_deletion_invalid_params_2(server):
814
    ret = server.delete("/api/certificates/a_big_number")
815
    assert ret.status_code == 400
816
    assert not ret.json["success"]

Také k dispozici: Unified diff