示例#1
0
def main():
    # Set up the tester.
    test = asst3.start_test('orm custom types (Datetime and Coordinate) test',
                            TOTAL_MARK)

    # Import student's code.
    import orm

    mark = 0
    case_number = 1

    output = orm.export("easydb", asst3_schema)
    with open(STUDENT_FILE, "wt") as f:
        f.write(output)

    # Start the server.
    server = asst3.Server(filename="student_export.txt")
    if not server.start("preload.txt"):
        print("ERROR: server could not start.\n" \
            "HINT: Check the correctness of the exported schema file")
        os.remove(STUDENT_FILE)
        return

    # Set up student's database object and connect to the database.
    db = orm.setup("easydb", asst3_schema)
    asst3.try_connect(db, server)

    # ===== CASE 1: Create a row object with Coordinate field with no error. =====

    print("CASE {}: Create a row object with Coordinate field with no error.".
          format(case_number))

    # This should not raise any error.
    try:
        toronto = asst3_schema.City(db, name="Toronto", location=(12.3, 12.3))

        if toronto.location == (12.3, 12.3):
            print("CASE {} PASS".format(case_number))
            mark = mark + 1
        else:
            print("CASE {} FAIL: the field is not set properly".format(
                case_number))
    except Exception as e:
        print("CASE {} FAIL: {}".format(case_number, str(e)))

    case_number = case_number + 1

    # ===== CASE 2: Create a row object with Coordinate field whose blank is set to True. =====

    print(
        "CASE {}: Create a row object with Coordinate field whose blank is set to True."
        .format(case_number))

    # This should not raise any error.
    try:
        toronto = asst3_schema.City(db, name="Toronto")

        if toronto.location == (0.0, 0.0):
            print("CASE {} PASS".format(case_number))
            mark = mark + 1
        else:
            print("CASE {} FAIL: the filed is not set properly".format(
                case_number))
    except Exception as e:
        print("CASE {} FAIL: {}".format(case_number, str(e)))

    case_number = case_number + 1

    # ===== CASE 3: Assign the Coordinate field with wrong type. =====

    print("CASE {}: Assign the Coordinate field with wrong type.".format(
        case_number))

    # This should raise an TypeError or ValueError error.
    try:
        toronto.location = 3
    except TypeError:
        print("CASE {} PASS".format(case_number))
        mark = mark + 1
    except ValueError:
        print("CASE {} PASS".format(case_number))
        mark = mark + 1
    else:
        print("CASE {} FAIL: {}".format(case_number,
                                        "expected TypeError or ValueError"))

    case_number = case_number + 1

    # ===== CASE 4: Assign and save the row object with Coordinate field with invalid value. =====

    print(
        "CASE {}: Assign and save the row object with Coordinate field with invalid value."
        .format(case_number))

    # This should raise a ValueError error.
    try:
        toronto.location = (200.2, 500.3)
        toronto.save()
    except ValueError:
        print("CASE {} PASS".format(case_number))
        mark = mark + 1
    except Exception as e:
        print("CASE {} FAIL: {}".format(case_number, str(e)))
    else:
        print("CASE {} FAIL: {}".format(case_number, "expected ValueError"))

    case_number = case_number + 1

    # ===== CASE 5: Save and get the row object with Coordinate field with no error. =====

    print(
        "CASE {}: Save and get the row object with Coordinate field with no error."
        .format(case_number))

    # This should not raise any error.
    try:
        toronto.location = (43.74, -79.37)
        toronto.save()
    except Exception as e:
        print("CASE {} FAIL: {}".format(case_number))
    else:
        try:
            city1 = asst3_schema.City.get(db, 1)

            if city1.location == (43.74, -79.37):
                print("CASE {} PASS".format(case_number))
                mark = mark + 1
            else:
                print(
                    "CASE {} FAIL: the saved and received field do not match".
                    format(case_number))
        except Exception as e:
            print("CASE {} FAIL: {}".format(case_number, str(e)))

    case_number = case_number + 1

    # ===== CASE 6: Filter the row object with Coordinate field. =====

    print("CASE {}: Filter the row object with Coordinate field.".format(
        case_number))

    # This should not raise any error.
    try:
        not_toronto_A = asst3_schema.City(db,
                                          name="NotTorontoA",
                                          location=(43.74, 12.3))
        not_toronto_B = asst3_schema.City(db,
                                          name="NotTorontoB",
                                          location=(12.3, -79.37))
        not_toronto_A.save()
        not_toronto_B.save()

        results1 = asst3_schema.City.filter(db, location=(43.74, -79.37))
        results2 = asst3_schema.City.filter(db, location__ne=(43.74, -79.37))

        # equal case
        if results1[0].name == "Toronto" and len(results1) == 1:

            # not equal case
            if results2[0].name in ["NotTorontoA", "NotTorontoB"
                                    ] and results2[1].name in [
                                        "NotTorontoA", "NotTorontoB"
                                    ] and len(results2) == 2:
                print("CASE {} PASS".format(case_number))
                mark = mark + 1
            else:
                print(
                    "CASE {} FAIL: the filter result (not equal case) is not correct"
                    .format(case_number))

        else:
            print(
                "CASE {} FAIL: the filter result (equal case) is not correct".
                format(case_number))
    except Exception as e:
        print("CASE {} FAIL: {}".format(case_number, str(e)))

    case_number = case_number + 1

    # ===== CASE 7: Create a row object with DateTime field with no error. =====

    print("CASE {}: Create a row object with Datetime field with no error.".
          format(case_number))

    # This should not raise any error.
    try:
        midterm = asst3_schema.Event(db,
                                     location=toronto,
                                     start=datetime(2019, 10, 29, 16, 0),
                                     end=datetime(2019, 10, 29, 17, 30))

        if midterm.start == datetime(2019, 10, 29, 16,
                                     0) and midterm.end == datetime(
                                         2019, 10, 29, 17, 30):
            print("CASE {} PASS".format(case_number))
            mark = mark + 1
        else:
            print("CASE {} FAIL: the field is not set properly".format(
                case_number))
    except Exception as e:
        print("CASE {} FAIL: {}".format(case_number, str(e)))

    case_number = case_number + 1

    # ===== CASE 8: Create a row object with DateTime field whose blank is set to True is set properly. =====

    print(
        "CASE {}: Create a row object with DateTime field whose blank is set to True."
        .format(case_number))

    # This should not raise any error.
    try:
        due = asst3_schema.Event(db,
                                 location=toronto,
                                 start=datetime(2019, 11, 17, 23, 59))

        if due.end == datetime.fromtimestamp(0):
            print("CASE {} PASS".format(case_number))
            mark = mark + 1
        else:
            print("CASE {} FAIL: the field is not set properly".format(
                case_number))
    except Exception as e:
        print("CASE {} FAIL: {}".format(case_number, str(e)))

    case_number = case_number + 1

    # ===== CASE 9: Create a row object with DateTime field whose default is set properly (calling a function). =====

    print(
        "CASE {}: Create a row object with DateTime field whose default is set properly (calling a function)."
        .format(case_number))

    # This should not raise any error.
    try:
        event1 = asst3_schema.Event(db,
                                    location=toronto,
                                    end=datetime(2019, 11, 17, 12))

        if type(event1.start) is datetime:
            print("CASE {} PASS".format(case_number))
            mark = mark + 1
        else:
            print("CASE {} FAIL: the field is not set properly".format(
                case_number))
    except Exception as e:
        print("CASE {} FAIL: {}".format(case_number, str(e)))

    case_number = case_number + 1

    # ===== CASE 10: Assign the Datetime field with wrong type. =====

    print("CASE {}: Assign the Datetime field with wrong type.".format(
        case_number))

    # This should raise a TypeError error.
    try:
        event1.start = 3
    except TypeError:
        print("CASE {} PASS".format(case_number))
        mark = mark + 1
    except Exception as e:
        print("CASE {} FAIL: {}".format(case_number, str(e)))
    else:
        print("CASE {} FAIL: {}".format(case_number, "expected TypeError"))

    case_number = case_number + 1

    # ===== CASE 11: Assign the Datetime field with correct type. =====

    print("CASE {}: Assign the Datetime field with correct type.".format(
        case_number))

    # This should not raise any error.
    try:
        event1.start = datetime(2019, 9, 15, 12)

        if event1.start == datetime(2019, 9, 15, 12):
            print("CASE {} PASS".format(case_number))
            mark = mark + 1
        else:
            print("CASE {} FAIL: the field is not set properly".format(
                case_number))
    except Exception as e:
        print("CASE {} FAIL: {}".format(case_number, str(e)))

    case_number = case_number + 1

    # ===== CASE 12: Save and get the row object with Datetime field with no error. =====

    print(
        "CASE {}: Save and get the row object with Datetime field with no error."
        .format(case_number))

    # This should not raise any error.
    try:
        event1.save()
    except Exception as e:
        print("CASE {} FAIL: {}".format(case_number, str(e)))
    else:
        # This should not raise any error.
        try:
            event2 = asst3_schema.Event.get(db, 1)

            if event2.start == datetime(2019, 9, 15, 12):
                print("CASE {} PASS".format(case_number))
                mark = mark + 1
            else:
                print(
                    "CASE {} FAIL: the saved and received field do not match".
                    format(case_number))
        except Exception as e:
            print("CASE {} FAIL: {}".format(case_number, str(e)))

    case_number = case_number + 1

    # ===== CASE 13: Filter the row object with Datetime field. =====

    print("CASE {}: Filter the row object with Datetime field.".format(
        case_number))

    # This should not raise any error.
    try:
        results = asst3_schema.Event.filter(db,
                                            start=datetime(2019, 9, 15, 12))

        if (results[0].location.name == "Toronto") and (len(results) == 1):
            mark = mark + 1
            print("CASE {} PASS".format(case_number))
        else:
            print("CASE {} FAIL: filter result is not correct".format(
                case_number))
    except Exception as e:
        print("CASE {} FAIL: {}".format(case_number, str(e)))

    case_number = case_number + 1

    # ===== CASE 14: Count the row object with Datetime field. =====

    print("CASE {}: Count the row object with Datetime field.".format(
        case_number))

    # This should not raise any error.
    try:
        results = asst3_schema.Event.filter(db,
                                            start__gt=datetime(
                                                2019, 7, 15, 12))

        if (results[0].location.name == "Toronto") and (len(results) == 1):
            mark = mark + 1
            print("CASE {} PASS".format(case_number))
        else:
            print("CASE {} FAIL: count result is not correct".format(
                case_number))
    except Exception as e:
        print("CASE {} FAIL: {}".format(case_number, str(e)))

    test.add_mark(mark)
    db.close()
    server.end()
    os.remove(STUDENT_FILE)
示例#2
0
def main():
    # Set up the tester.
    test = asst3.start_test('orm get command test', TOTAL_MARK)

    # Import student's code.
    import orm

    mark = 0
    case_number = 1

    # Start the server.
    server = asst3.Server()
    server.start("preload.txt")

    # Set up student's database object and connect to the database.
    db = orm.setup("easydb", asst3_schema)
    asst3.try_connect(db, server)

    # ===== CASE 1: Get id which does not exist. =====

    print("CASE {}: Get id which does not exist.".format(case_number).format(
        case_number))
    (mark, result) = asst3.run_test_case(
        asst3_schema.User.get, (db, 777), case_number, 1, mark, True,
        orm.exceptions.ObjectDoesNotExist
    )  # This should raise an ObjectDoesNotExist error.
    case_number = case_number + 1

    # ===== CASE 2: Get a row object with no error. =====

    id_number = random.randint(1, 3)

    if id_number == 1:
        age = 38
    elif id_number == 2:
        age = 48
    else:
        age = 21

    print("CASE {}: Get a row object with no error.".format(case_number))

    # This should not raise any error.
    try:
        user1 = asst3_schema.User.get(db, id_number)

        if user1.age == age:
            print("CASE {} PASS".format(case_number))
            mark = mark + 1
        else:
            print(
                "CASE {} FAIL: the field value of the row object is not correct"
                .format(case_number))
    except Exception as e:
        print("CASE {} FAIL: {}".format(case_number, str(e)))

    case_number = case_number + 1

    # ===== CASE 3: Get a row object which has foreign key field with no error. =====

    id_number = random.randint(1, 4)

    if id_number == 1:
        firstName = "James"
    else:
        firstName = "Alice"

    print(
        "CASE {}: Get a row object which has foreign key field with no error.".
        format(case_number))

    # This should not raise any error.
    try:
        account1 = asst3_schema.Account.get(db, id_number)

        if (account1.type == "Normal") and (account1.user.firstName
                                            == firstName):
            print("CASE {} PASS".format(case_number))
            mark = mark + 1
        else:
            print(
                "CASE {} FAIL: the field value of the row object is not correct"
                .format(case_number))
    except Exception as e:
        print("CASE 2 FAIL: {}".format(case_number, str(e)))

    db.close()

    server.end()

    test.add_mark(mark)
示例#3
0
def main():
    # Set up the tester.
    test = asst3.start_test('easydb scan command test', TOTAL_MARK)

    # Import student's code.
    from orm import easydb, exceptions

    mark = 0
    case_number = 1

    # Start the server.
    server = asst3.Server()
    server.start(datafile="preload.txt")

    # database tables
    tb = (
        (
            "User",
            (  # table_name
                ("firstName", str),  # (column_name, type)
                ("lastName", str),
                ("height", float),
                ("age", int),
            )),
        (
            "Account",
            (
                ("user", "User"),  # (column_name, table_reference)
                ("type", str),
                ("balance", float),
            )))

    # Set up student's database object and connect to the database.
    db = easydb.Database(tb)
    asst3.try_connect(db, server)

    # ===== CASE 1: Table name does not exist. =====

    print("CASE {}: Table name does not exist.".format(case_number))
    (mark, result) = asst3.run_test_case(
        db.scan, ("Bob", ("firstName", easydb.OP_EQ, "James")), case_number, 1,
        mark, True, ValueError)  # This should raise an ValueError error.
    case_number = case_number + 1

    # ===== CASE 2: Query is not a tuple. =====

    print("CASE {}: Query is not a tuple.".format(case_number))
    (mark,
     result) = asst3.run_test_case(db.scan, ("User", 3), case_number, 1, mark,
                                   True,
                                   Exception)  # This should raise an error.
    case_number = case_number + 1

    # ===== CASE 3: Query has more than 3 elements. =====

    print("CASE {}: Query has more than 3 elements.".format(case_number))
    (mark,
     result) = asst3.run_test_case(db.scan,
                                   ("User", ("age", easydb.OP_EQ, 27, 90)),
                                   case_number, 1, mark, True,
                                   Exception)  # This should raise an error.
    case_number = case_number + 1

    # ===== CASE 4: Query has less than 3 elements. =====

    print("CASE {}: Query has less than 3 elements.".format(case_number))
    (mark,
     result) = asst3.run_test_case(db.scan, ("User", ("age", easydb.OP_EQ)),
                                   case_number, 1, mark, True,
                                   Exception)  # This should raise an error.
    case_number = case_number + 1

    # ===== CASE 5: Column name is not a string. =====

    print("CASE {}: Column name is not a string.".format(case_number))
    (mark,
     result) = asst3.run_test_case(db.scan, ("User", (3, easydb.OP_EQ, 27)),
                                   case_number, 1, mark, True,
                                   Exception)  # This should raise an error.
    case_number = case_number + 1

    # ===== CASE 6: Column name does not exist. =====

    print("CASE {}: Column name does not exist.".format(case_number))
    (mark, result) = asst3.run_test_case(
        db.scan, ("User", ("bob", easydb.OP_EQ, 27)), case_number, 1, mark,
        True, ValueError)  # This should raise an ValueError error.
    case_number = case_number + 1

    # ===== CASE 7: Operator is not supported. =====

    print("CASE {}: Operator is not supported.")
    (mark, result) = asst3.run_test_case(
        db.scan, ("User", ("age", 10, 27)), case_number, 1, mark, True,
        ValueError)  # This should raise an ValueError error.
    case_number = case_number + 1

    # ===== CASE 8: Type of operand does not match. =====

    print("CASE {}: Type of operand does not match.".format(case_number))
    (mark, result) = asst3.run_test_case(
        db.scan, ("User", ("age", easydb.OP_EQ, "27")), case_number, 1, mark,
        True, ValueError)  # This should raise an ValueError error.
    case_number = case_number + 1

    # ===== CASE 9: Operator of a foreign key operand is not OP_EQ or OP_NE. =====

    print("CASE {}: Operator of a foreign key column is not OP_EQ or OP_NE.".
          format(case_number))
    (mark, result) = asst3.run_test_case(
        db.scan, ("Account", ("user", easydb.OP_GT, 10)), case_number, 1, mark,
        True, ValueError)  # This should raise an ValueError error.
    case_number = case_number + 1

    # ===== CASE 10: Operand of a foreign key column is not an integer. =====

    print("CASE {}: Operand of a foreign key column is not an integer.".format(
        case_number))
    (mark, result) = asst3.run_test_case(
        db.scan, ("Account", ("user", easydb.OP_EQ, "Bob")), case_number, 1,
        mark, True, ValueError)  # This should raise an ValueError error.
    case_number = case_number + 1

    # ===== CASE 11: Everything is ok with equal operator. =====

    print("CASE {}: Everything is ok with equal operator.".format(case_number))

    # This should not raise any error.
    try:
        IDs = db.scan("User", ("firstName", easydb.OP_EQ, "James"))
    except Exception as e:
        print("CASE {} FAIL: {}".format(case_number, str(e)))
    else:
        if [1] == IDs:
            print("CASE {} PASS".format(case_number))
            mark = mark + 1
        else:
            print("CASE {} FAIL: the scan result is not correct".format(
                case_number))

    case_number = case_number + 1

    # ===== CASE 12: Everything is ok with not equal operator. =====

    print("CASE {}: Everything is ok with not equal operator.".format(
        case_number))

    # This should not raise any error.
    try:
        IDs = db.scan("User", ("firstName", easydb.OP_NE, "James"))
    except Exception as e:
        print("CASE {} FAIL: {}".format(case_number, str(e)))
    else:
        if IDs is not None and all(ID in IDs
                                   for ID in [2, 3]) and len(IDs) == 2:
            print("CASE {} PASS".format(case_number))
            mark = mark + 1
        else:
            print("CASE {} FAIL: the scan result is not correct".format(
                case_number))

    case_number = case_number + 1

    # ===== CASE 13: Everything is ok with less than operator. =====

    print("CASE {}: Everything is ok with less than operator.".format(
        case_number))

    # This should not raise any error.
    try:
        IDs = db.scan("User", ("age", easydb.OP_LT, 100))
    except Exception as e:
        print("CASE {} FAIL: {}".format(case_number, str(e)))
    else:
        if IDs is not None and all(ID in IDs
                                   for ID in [1, 2, 3]) and len(IDs) == 3:
            print("CASE {} PASS".format(case_number))
            mark = mark + 1
        else:
            print("CASE {} FAIL: the scan result is not correct".format(
                case_number))

    case_number = case_number + 1

    # ===== CASE 14: Everything is ok with greater than operator. =====

    print("CASE {}: Everything is ok with greater than operator.".format(
        case_number))

    # This should not raise any error.
    try:
        IDs = db.scan("User", ("height", easydb.OP_GT, 190.0))
    except Exception as e:
        db.close()
        print("CASE {} FAIL: {}".format(case_number, str(e)))
    else:
        db.close()
        if IDs is not None and len(IDs) == 0:
            line = 'Request { table_id: 1, command: Query(3, 4, Float(190.0)) }'
            if server.expect(line) is not None:
                print("CASE {} PASS".format(case_number))
                mark = mark + 1
            else:
                print("CASE {} FAIL: server did not receive the Scan command".
                      format(case_number))
        else:
            print("CASE {} FAIL: the scan result is not correct".format(
                case_number))

    server.end()

    test.add_mark(mark)
def main():
    # Set up the tester.
    test = asst3.start_test('easydb drop command test', TOTAL_MARK)

    # Import student's code.
    from orm import easydb, exceptions

    mark = 0
    case_number = 1

    # Start the server.
    server = asst3.Server()
    server.start(datafile="preload.txt")

    # database tables
    tb = (
        ("User", ( # table_name
            ("firstName", str), # (column_name, type)
            ("lastName", str),
            ("height", float),
            ("age", int),
        )),
    
        ("Account", (
            ("user", "User"), # (column_name, table_reference)
            ("type", str),
            ("balance", float),
        ))
    )

    # Set up student's database object and connect to the database.
    db = easydb.Database(tb)
    asst3.try_connect(db, server)

    # ===== CASE 1: Drop non-existing row. =====

    print("CASE {}: Drop non-existing row.".format(case_number))
    (mark, result) = asst3.run_test_case(db.drop, ("User", 300), case_number, 1, mark, True, exceptions.ObjectDoesNotExist) # This should raise an ObjectDoesNotExist error.
    case_number = case_number + 1

    # ===== CASE 2: Table name does not exist. =====

    print("CASE {}: Table name does not exist.".format(case_number))
    (mark, result) = asst3.run_test_case(db.drop, ("Hahaha", 1), case_number, 1, mark, True, ValueError) # This should raise an ValueError error.
    case_number = case_number + 1

    # ===== CASE 3: Everything is ok. =====

    print("CASE {}: Everything is ok.".format(case_number))

    # This should not raise any error.
    try:
        db.drop("User", 2)
    except Exception as e:
        print("CASE {} FAIL: {}".format(case_number, str(e)))
        db.close()    
    else:
        db.close()
        
        # Dump database rows.
        rows = asst3.dump(server, 1)
    
        not_deleted = False
        for row in rows:
            if row[0] == "2":
                not_deleted = True
                break

        if not_deleted:
            print("CASE {} FAIL: the dropped row is still on the server".format(case_number))
        else:
            print("CASE {} PASS".format(case_number))
            mark = mark + 1

    server.end()

    test.add_mark(mark)
示例#5
0
def main():
    # Set up the tester.
    test = asst3.start_test('orm delete command test', TOTAL_MARK)

    # Import student's code.
    import orm

    mark = 0
    case_number = 1

    # Start the server.
    server = asst3.Server()
    server.start("preload.txt")

    # Set up student's database object and connect to the database.
    db = orm.setup("easydb", asst3_schema)
    asst3.try_connect(db, server)

    # Create a row object for testing.
    james = asst3_schema.User(db,
                              firstName="James",
                              lastName="Hartley",
                              height=180.3,
                              age=38)
    james.pk = 1
    james.version = 1

    # ===== CASE 1: Delete a row object with no error. =====

    print("CASE {}: Delete a row object with no error.".format(case_number))

    # This should not raise any error.
    try:
        james.delete()
    except Exception as e:
        print("CASE {} FAIL: {}".format(case_number, str(e)))
    else:
        db.close()

        # Dump database rows.
        rows = asst3.dump(server, 1)

        not_deleted = False

        for row in rows:
            if row[0] == "1":
                not_deleted = True
                break

        if not_deleted:
            print(
                "CASE {} FAIL: the deleted row is still on the server".format(
                    case_number))
        else:
            print("CASE {} PASS".format(case_number))
            mark = mark + 1

        db.connect(server.host, server.port)

    case_number = case_number + 1

    # ===== CASE 2: Delete a row object whose pk is None. =====

    print("CASE {}: Delete a row object whose pk is None.".format(case_number))
    (mark, result) = asst3.run_test_case(
        james.delete, (), case_number, 1, mark, True,
        orm.exceptions.PacketError,
        True)  # This should raise an error other than PacketError.

    db.close()

    server.end()

    test.add_mark(mark)
示例#6
0
def main():
    # Set up the tester.
    test = asst3.start_test('easydb connection test', TOTAL_MARK)
    
    # Import student's code.
    from orm import easydb

    case_number = 1

    # Start the server.
    server = asst3.Server()
    server.start()

    # database tables
    tb = (
        ("User", ( # table_name
            ("firstName", str), # (column_name, type)
            ("lastName", str),
            ("height", float),
            ("age", int),
        )),
        
        ("Account", (
            ("user", "User"), # (column_name, table_reference)
            ("type", str),
            ("balance", float),
        ))
    )

    # ===== CASE 1: Connect to the database. =====

    print("CASE {}: Connect to the database.".format(case_number))

    try:
        db = easydb.Database(tb)
        asst3.try_connect(db, server)
    except OSError:
        print("CASE {} FAIL: could not connect to database".format(case_number))
        server.end()
        return
    else:
        if server.expect("Connected to 127.0.0.1:") is None:
            print("CASE {} FAIL: server did not receive connection".format(case_number))
            server.end()
            return
        else:
            test.add_mark(1)
            print("CASE 1 PASS")
    
    case_number = case_number + 1

    # ===== CASE 2: Close the connection to database. =====

    print("CASE {}: Close the connection to database.".format(case_number)) 

    db.close()
    if server.look(r"Request { table_id: \d+, command: Exit }") is None:
        print("CASE {} FAIL: server did not receive the Exit command".format(case_number))
    else:
        print("CASE {} PASS".format(case_number))
        test.add_mark(1)

    server.end()
示例#7
0
def main():
    # Set up the tester.
    test = asst3.start_test('easydb insert command test', TOTAL_MARK)
    
    # Import student's code.
    from orm import easydb, exceptions

    mark = 0
    case_number = 1

    # Start the server.
    server = asst3.Server()
    server.start()

    # database tables
    tb = (
        ("User", ( # table_name
            ("firstName", str), # (column_name, type)
            ("lastName", str),
            ("height", float),
            ("age", int),
        )),
    
        ("Account", (
            ("user", "User"), # (column_name, table_reference)
            ("type", str),
            ("balance", float),
        ))
    )

    # Set up student's database object and connect to the database.
    db = easydb.Database(tb)
    asst3.try_connect(db, server)

    # ===== CASE 1: There is an extra element in the inserted row. =====

    print("CASE {}: There is an extra element in the inserted row.".format(case_number))
    (mark, result) = asst3.run_test_case(db.insert, ("User", ["Jay", "Sung", 5.5, 31, 33]), case_number, 1, mark, True, ValueError) # This should raise a ValueError error.
    case_number = case_number + 1

    # ===== CASE 2: There is missing an element in the inserted row. =====

    print("CASE {}: There is missing an element in the inserted row.".format(case_number))
    (mark, result) = asst3.run_test_case(db.insert, ("User", ["Jay", "Sung", 5.5]), case_number, 1, mark, True, ValueError) # This should raise a ValueError error.
    case_number = case_number + 1

    # ===== CASE 3: Type of the column in the inserted row does not match. =====

    print("CASE {}: Type of the column in the inserted row does not match.".format(case_number))
    (mark, result) = asst3.run_test_case(db.insert, ("User", ["Jay", "Sung", "Dog", 31]), case_number, 1, mark, True, ValueError) # This should raise a ValueError error.
    case_number = case_number + 1

    # ===== CASE 4: Table name is not a string. =====

    print("CASE {}: Table name is not a string.".format(case_number))
    (mark, result) = asst3.run_test_case(db.insert, (123, ["Jay", "Sung", 5.5, 31]), case_number, 1, mark, True, ValueError) # This should raise a ValueError error.
    case_number = case_number + 1

    # ===== CASE 5: Table name does not exist in the database. =====

    print("CASE 5: Table name does not exist in the database.".format(case_number))
    (mark, result) = asst3.run_test_case(db.insert, ("Test", ["Jay", "Sung", 5.5, 31]), case_number, 1, mark, True, ValueError) # This should raise a ValueError error.
    case_number = case_number + 1

    # ===== CASE 6: Everything is ok. =====

    print("CASE {}: Everything is ok.".format(case_number))

    # Randomly generate attribute information.
    first_name = ''.join(random.choice(string.ascii_lowercase) for i in range(6)).capitalize()
    last_name = ''.join(random.choice(string.ascii_lowercase) for i in range(6)).capitalize()
    height = random.randint(1200, 2000) / 10
    age = random.randint(1, 100) 

    # This should not raise any error.
    try:
        pk, version = db.insert("User", [first_name, last_name, height, age])
    except Exception as e:
        db.close()
        print("CASE {} FAIL: {}".format(case_number, str(e)))
    else:
        db.close()
    
        # Dump database rows.
        rows = asst3.dump(server, 1)

        if [str(pk), str(version), first_name, last_name, str(height), str(age)] in rows or [str(pk), str(version), first_name, last_name, str(int(height)), str(age)] in rows:
            print("CASE {} PASS".format(case_number))
            mark = mark + 1
        else:
            print("CASE {} FAIL: the inserted row cannot be found on the server".format(case_number))

    server.end()

    test.add_mark(mark)
def main():
    # Set up the tester.
    test = asst3.start_test('easydb get command test', TOTAL_MARK)

    # Import student's code.
    from orm import easydb, exceptions

    mark = 0
    case_number = 1

    # Start the server.
    server = asst3.Server()
    server.start(datafile="preload.txt")

    # database tables
    tb = (
        (
            "User",
            (  # table_name
                ("firstName", str),  # (column_name, type)
                ("lastName", str),
                ("height", float),
                ("age", int),
            )),
        (
            "Account",
            (
                ("user", "User"),  # (column_name, table_reference)
                ("type", str),
                ("balance", float),
            )))

    # Set up student's database object and connect to the database.
    db = easydb.Database(tb)
    asst3.try_connect(db, server)

    # ===== CASE 1: Get non-existing row. =====

    print("CASE {}: Get non-existing row.".format(case_number))
    (mark, result) = asst3.run_test_case(
        db.get, ("User", 300), case_number, 1, mark, True, exceptions.
        ObjectDoesNotExist)  # This should raise an ObjectDoesNotExist error.
    case_number = case_number + 1

    # ===== CASE 2: Table name does not exist. =====

    print("CASE {}: Table name does not exist.".format(case_number))
    (mark, result) = asst3.run_test_case(
        db.get, ("Hahaha", 1), case_number, 1, mark, True,
        ValueError)  # This should raise an ValueError error.
    case_number = case_number + 1

    # ===== CASE 2: Everything is ok. =====

    print("CASE {}: Everything is ok.".format(case_number))

    # This should not raise any error.
    try:
        values, version = db.get("User", 1)
    except Exception as e:
        db.close()
        print("CASE {} FAIL: {}".format(case_number, str(e)))
    else:
        db.close()
        if values == ["James", "Hartley", 180.3, 38]:
            if server.expect(
                    'Request { table_id: 1, command: Get(1) }') is not None:
                print("CASE {} PASS".format(case_number))
                mark = mark + 1
            else:
                print("CASE {} FAIL: server did not receive the Get command".
                      format(case_number))
        else:
            print("CASE {} FAIL: the received row is not correct".format(
                case_number))

    server.end()

    test.add_mark(mark)
def main():
    # Set up the tester.
    test = asst3.start_test('orm save command test', TOTAL_MARK)

    # Import student's code.
    import orm 

    mark = 0
    case_number = 1

    # Start the server.
    server = asst3.Server()
    server.start()

    # Set up student's database object and connect to the database.
    db = orm.setup("easydb", asst3_schema)
    asst3.try_connect(db, server)

    # Create some row objects for testing.
    joe = asst3_schema.User(db, firstName="Joe", lastName="Harris", age=32)
    jeffrey = asst3_schema.User(db, firstName="Jeffrey", lastName="Fang", height=999.9)
    alice = asst3_schema.User(db, firstName="Alice", lastName="Stuart", age=18)
    account1 = asst3_schema.Account(db, user=alice, type="Yes")
    account2 = asst3_schema.Account(db, user=jeffrey, type="Special")

    # ===== CASE 1: Save a row object whose field is not in choices. =====

    print("CASE {}: Save a row object whose field is not in choices.".format(case_number))
    (mark, result) = asst3.run_test_case(account1.save, (), case_number, 1, mark, True, ValueError) # This should raise a ValueError error.
    case_number = case_number + 1

    # ===== CASE 2: Save a new row object to the database with no error (insert). =====

    print("CASE {}: Save a new row object to the database with no error (insert).".format(case_number))

    # This should not raise any error.
    try:
        joe.save()
    except Exception as e:
        print("CASE {} FAIL: {}".format(case_number, str(e)))
    else:
        db.close()

        # Dump database rows.
        rows = asst3.dump(server, 1)

        if [str(1), str(1), "Joe", "Harris", "0", "32"] in rows or [str(2), str(1), "Joe", "Harris", "0", "32"] in rows:
            print("CASE {} PASS".format(case_number))
            mark = mark + 1
        else:
            print("CASE {} FAIL: the saved row cannot be found on the server".format(case_number))

        db.connect(server.host, server.port)

    case_number = case_number + 1

    # ===== CASE 3: Cascade save new row objects to the database with no error (insert). =====

    print("CASE {}: Cascade save new row objects to the database with no error (insert).".format(case_number))

    # This should not raise any error.
    try:
        account2.save()
    except Exception as e:
        print("CASE {} FAIL: {}".format(case_number, str(e)))
    else:
        db.close()

        # Dump database rows.
        client = asst3.Client(server)
        user_rows = client.dump(1)
        account_rows = client.dump(2)
        client.close()

        if ([str(2), str(1), "Jeffrey", "Fang", "999.9", "0"] in user_rows or [str(3), str(1), "Jeffrey", "Fang", "999.9", "0"] in user_rows) \
        and ([str(1), str(1), "2", "Special", "0"] in account_rows or [str(2), str(1), "2", "Special", "0"] in account_rows \
        or [str(1), str(1), "3", "Special", "0"] in account_rows or [str(2), str(1), "3", "Special", "0"] in account_rows):
            print("CASE {} PASS".format(case_number))
            mark = mark + 1
        else:
            print("CASE {} FAIL: the saved row cannot be found on the server".format(case_number))

        db.connect(server.host, server.port)

    case_number = case_number + 1

    # ===== CASE 4: Save a existing row object to the database (update). =====

    joe.height = 663.1

    print("CASE {}: Save a existing row object to the database (update).".format(case_number))

    # This should not raise any error.
    try:
        joe.save()
    except Exception as e:
        print("CASE {} FAIL: {}".format(case_number, str(e)))
    else:
        db.close()

        # Dump database rows.
        rows = asst3.dump(server, 1)

        if [str(1), str(2), "Joe", "Harris", "663.1", "32"] in rows or [str(2), str(2), "Joe", "Harris", "663.1", "32"] in rows:
            print("CASE {} PASS".format(case_number))
            mark = mark + 1
        else:
            print("CASE {} FAIL: the saved row cannot be found on the server".format(case_number))

        db.connect(server.host, server.port)

    case_number = case_number + 1

    # ===== CASE 5: Non-atomic save (non-atomic update) =====

    joe.age = 50

    print("CASE {}: Non-atomic save (non-atomic update)".format(case_number))

    # This may raise a TransactionAbort error.
    try:
        joe.save()
    except orm.TransactionAbort:
        print("CASE {} PASS".format(case_number))
        mark = mark + 1
    except Exception as e:
        print("CASE {} FAIL: {}".format(case_number, str(e)))
    else:
        db.close() 

        # Dump database rows.
        rows = asst3.dump(server, 1)

        if [str(1), str(3), "Joe", "Harris", "663.1", "50"] in rows or [str(2), str(3), "Joe", "Harris", "663.1", "50"] in rows:
            print("CASE {} PASS".format(case_number))
            mark = mark + 1
        else:
            print("CASE {} FAIL: the saved row cannot be found on the server".format(case_number))

        db.connect(server.host, server.port)

    case_number = case_number + 1

    # ===== CASE 6: Row object's id does not exist in the database anymore (invalid reference). =====

    jeffrey.pk = 888

    print("CASE {}: Row object's id does not exist in the database anymore (invalid reference).".format(case_number))

    # This should raise an InvalidReference error.
    try:
        account2.save()
    except orm.exceptions.InvalidReference:
        if jeffrey.pk is None:
            mark = mark + 1
            print("CASE {} PASS".format(case_number))
        else:
            print("CASE {} FAIL: pk is not set back to None".format(case_number))
    except Exception as e:
        print("CASE {} FAIL: {}".format(case_number, str(e)))
    else:
        print("CASE {} FAIL: {}".format(case_number, "expected InvalidReference"))

    db.close()

    server.end()

    test.add_mark(mark)
示例#10
0
def main():
	# Set up the tester.
	test = asst3.start_test('orm filter command test', TOTAL_MARK)

	# Import student's code.
	import orm 

	mark = 0
	case_number = 1

	# Start the server.
	server = asst3.Server()
	server.start("preload.txt")

	# Set up student's database object and connect to the database.
	db = orm.setup("easydb", asst3_schema)
	asst3.try_connect(db, server)

	# Create a row object for testing.
	charlie = asst3_schema.User(db, firstName="Charlie", lastName="George", height=180.3, age=26)
	alice = asst3_schema.User(db, firstName="Alice", lastName="Harris", height=163.2, age=21)
	alice.pk = 3
	alice.version = 1

	# ===== CASE 1: Filter with no argument with no error. =====

	print("CASE {}: Filter with no argument with no error.".format(case_number))

	# This should not raise any error.
	try:
		results = asst3_schema.User.filter(db)

		if len(results) == 3 and results[0].age in [38, 48, 21]:
			print("CASE {} PASS".format(case_number))
			mark = mark + 1
		else:
			print("CASE {} FAIL: filter result is not correct".format(case_number))
	except Exception as e:
		print("CASE {} FAIL {}".format(case_number, str(e)))

	case_number = case_number + 1

	# ===== CASE 2: Filter with equal operator with no error. =====

	print("CASE {}: Filter with equal operator with no error.".format(case_number))

	# This should not raise any error.
	try:
		results = asst3_schema.User.filter(db, age=21)

		if (results[0].height == 163.2) and (len(results) == 1):
			print("CASE {} PASS".format(case_number))
			mark = mark + 1
		else:
			print("CASE {} FAIL: filter result is not correct".format(case_number))
	except Exception as e:
		print("CASE {} FAIL {}".format(case_number, str(e)))

	case_number = case_number + 1

	# ===== CASE 3: Filter with not eqaul operator with no error. =====

	print("CASE {}: Filter with not eqaul operator with no error.".format(case_number))

	# This should not raise any error.
	try:
		results = asst3_schema.Account.filter(db, balance__ne=89.1)

		if len(results) == 4 and results[0].type == "Normal":
			print("CASE {} PASS".format(case_number))
			mark = mark + 1
		else:
			print("CASE {} FAIL: filter result is not correct".format(case_number))
	except Exception as e:
		print("CASE {} FAIL {}".format(case_number, str(e)))
		
	case_number = case_number + 1

	# ===== CASE 4: Filter with greater than operator with no error. =====

	print("CASE {}: Filter with greater than operator with no error.".format(case_number))

	# This should not raise any error.
	try:
		results = asst3_schema.Account.filter(db, balance__gt=89.1)

		if len(results) == 2 and results[0].type == "Normal":
			print("CASE {} PASS".format(case_number))
			mark = mark + 1
		else:
			print("CASE {} FAIL: filter result is not correct".format(case_number))
	except Exception as e:
		print("CASE {} FAIL {}".format(case_number, str(e)))
		
	case_number = case_number + 1

	# ===== CASE 5: Filter with less than operator with no error. =====

	print("CASE {}: Filter with less than operator with no error.".format(case_number))

	# This should not raise any error.
	try:
		results = asst3_schema.Account.filter(db, balance__lt=210.3)

		if len(results) == 3 and results[0].type == "Normal":
			print("CASE {} PASS".format(case_number))
			mark = mark + 1
		else:
			print("CASE {} FAIL: filter result is not correct".format(case_number))
	except Exception as e:
		print("CASE {} FAIL: {}".format(case_number, str(e)))
		
	case_number = case_number + 1

	# ==== CASE 6: Filter with a foreign key object. =====

	print("CASE {}: Filter with a foreign key object.".format(case_number))

	# This should not raise any error.
	try:
		results = asst3_schema.Account.filter(db, user=alice)

		if len(results) == 3 and results[0].user.firstName == "Alice":
			print("CASE {} PASS".format(case_number))
			mark = mark + 1
		else:
			print("CASE {} FAIL: filter result is not correct".format(case_number))
	except Exception as e:
		print("CASE {} FAIL: {}".format(case_number, str(e)))

	case_number = case_number + 1

	# ==== CASE 7: Filter with a foreign key pk value. =====

	print("CASE {}: Filter with a foreign key pk value.".format(case_number))

	# This should not raise any error.
	try:
		results = asst3_schema.Account.filter(db, user=3)

		if len(results) == 3 and results[0].user.firstName == "Alice":
			print("CASE {} PASS".format(case_number))
			mark = mark + 1
		else:
			print("CASE {} FAIL: filter result is not correct".format(case_number))
	except Exception as e:
		print("CASE {} FAIL: {}".format(case_number, str(e)))

	case_number = case_number + 1

	# ===== CASE 8: Filter with a foreign key object whose pk is None. =====

	print("CASE {}: Filter with a foreign key object whose pk is None.".format(case_number))

	# This should raise an error.
	try:
		results = asst3_schema.Account.filter(db, user=charlie)
	except:
		print("CASE {} PASS".format(case_number))
		mark = mark + 1
	else:
		print("CASE {} FAIL: {}".format(case_number, "expected an error"))

	db.close()

	server.end()

	test.add_mark(mark)
def main():
	# Set up the tester.
	test = asst3.start_test('orm count command test', TOTAL_MARK)

	# Import student's code.
	import orm 

	mark = 0
	case_number = 1

	# Start the server.
	server = asst3.Server()
	server.start("preload.txt")

	# Set up student's database object and connect to the database.
	db = orm.setup("easydb", asst3_schema)
	asst3.try_connect(db, server)

	# ===== CASE 1: Count with no argument with no error. =====

	print("CASE {}: Count with no argument with no error.".format(case_number))

	# This should not raise any error.
	try:
		result = asst3_schema.Account.count(db)

		if result == 4:
			print("CASE {} PASS".format(case_number))
			mark = mark + 1
		else:
			print("CASE {} FAIL: count result is not correct".format(case_number))
	except Exception as e:
		print("CASE {} FAIL: {}".format(case_number, str(e)))

	case_number = case_number + 1

	# ===== CASE 2: Count with an argument with no error. =====

	print("CASE {}: Count with an argument with no error.".format(case_number))

	# This should not raise any error.
	try:
		result = asst3_schema.Account.count(db, balance__gt=89.1)

		if result == 2:
			print("CASE {} PASS".format(case_number))
			mark = mark + 1
		else:
			print("CASE {} FAIL: count result is not correct".format(case_number))
	except Exception as e:
		print("CASE {} FAIL: {}".format(case_number, str(e)))

	case_number = case_number + 1

	# ==== CASE 3: Count with an existing pk. =====

	print("CASE {}: Count with pk.".format(case_number))

	# This should not raise any error.
	try:
		result = asst3_schema.Account.count(db, pk=3)

		if result == 1:
			print("CASE {} PASS".format(case_number))
			mark = mark + 1
		else:
			print("CASE {} FAIL: count result is not correct".format(case_number))
	except Exception as e:
		print("CASE {} FAIL: {}".format(case_number, str(e)))

	case_number = case_number + 1

	# ==== CASE 4: Count with an non-existing pk. =====

	print("CASE {}: Count with pk.".format(case_number))

	# This should not raise any error.
	try:
		result = asst3_schema.Account.count(db, pk=100)

		if result == 0:
			print("CASE {} PASS".format(case_number))
			mark = mark + 1
		else:
			print("CASE {} FAIL: count result is not correct".format(case_number))
	except Exception as e:
		print("CASE {} FAIL: {}".format(case_number, str(e)))

	db.close()

	server.end()

	test.add_mark(mark)