def test_rfc3339_w_nanos_w_leading_zero_and_no_trailing_zeros():
    stamp = datetime_helpers.DatetimeWithNanoseconds(2016,
                                                     12,
                                                     20,
                                                     21,
                                                     13,
                                                     47,
                                                     nanosecond=1234500)
    assert stamp.rfc3339() == "2016-12-20T21:13:47.0012345Z"
def test_timestamp_pb_wo_nanos_naive():
    stamp = datetime_helpers.DatetimeWithNanoseconds(2016, 12, 20, 21, 13, 47,
                                                     123456)
    delta = stamp.replace(
        tzinfo=datetime.timezone.utc) - datetime_helpers._UTC_EPOCH
    seconds = int(delta.total_seconds())
    nanos = 123456000
    timestamp = timestamp_pb2.Timestamp(seconds=seconds, nanos=nanos)
    assert stamp.timestamp_pb() == timestamp
def test_rfc3339_w_nanos_no_trailing_zeroes():
    stamp = datetime_helpers.DatetimeWithNanoseconds(2016,
                                                     12,
                                                     20,
                                                     21,
                                                     13,
                                                     47,
                                                     nanosecond=100000000)
    assert stamp.rfc3339() == "2016-12-20T21:13:47.1Z"
def test_rfc3339_w_nanos():
    stamp = datetime_helpers.DatetimeWithNanoseconds(2016,
                                                     12,
                                                     20,
                                                     21,
                                                     13,
                                                     47,
                                                     nanosecond=123456789)
    assert stamp.rfc3339() == "2016-12-20T21:13:47.123456789Z"
def test_ctor_w_micros_keyword_and_nanos():
    with pytest.raises(TypeError):
        datetime_helpers.DatetimeWithNanoseconds(2016,
                                                 12,
                                                 20,
                                                 21,
                                                 13,
                                                 47,
                                                 microsecond=123456,
                                                 nanosecond=123456789)
def test_ctor_wo_nanos():
    stamp = datetime_helpers.DatetimeWithNanoseconds(2016, 12, 20, 21, 13, 47,
                                                     123456)
    assert stamp.year == 2016
    assert stamp.month == 12
    assert stamp.day == 20
    assert stamp.hour == 21
    assert stamp.minute == 13
    assert stamp.second == 47
    assert stamp.microsecond == 123456
    assert stamp.nanosecond == 123456000
def test_from_rfc3339_w_full_precision():
    timestamp = "2016-12-20T21:13:47.123456789Z"
    expected = datetime_helpers.DatetimeWithNanoseconds(
        2016,
        12,
        20,
        21,
        13,
        47,
        nanosecond=123456789,
        tzinfo=datetime.timezone.utc)
    stamp = datetime_helpers.DatetimeWithNanoseconds.from_rfc3339(timestamp)
    assert stamp == expected
def test_from_rfc3339_w_partial_precision():
    timestamp = "2016-12-20T21:13:47.1Z"
    expected = datetime_helpers.DatetimeWithNanoseconds(
        2016,
        12,
        20,
        21,
        13,
        47,
        microsecond=100000,
        tzinfo=datetime.timezone.utc)
    stamp = datetime_helpers.DatetimeWithNanoseconds.from_rfc3339(timestamp)
    assert stamp == expected
def test_timestamp_pb_w_nanos():
    stamp = datetime_helpers.DatetimeWithNanoseconds(
        2016,
        12,
        20,
        21,
        13,
        47,
        nanosecond=123456789,
        tzinfo=datetime.timezone.utc)
    delta = stamp - datetime_helpers._UTC_EPOCH
    timestamp = timestamp_pb2.Timestamp(seconds=int(delta.total_seconds()),
                                        nanos=123456789)
    assert stamp.timestamp_pb() == timestamp
def test_replace():
    stamp = datetime_helpers.DatetimeWithNanoseconds(
        2016, 12, 20, 21, 13, 47, 123456, tzinfo=datetime.timezone.utc)

    # ns and ms provided raises
    with pytest.raises(TypeError):
        stamp.replace(microsecond=1, nanosecond=0)

    # No Nanoseconds or Microseconds
    new_stamp = stamp.replace(year=2015)
    assert new_stamp.year == 2015
    assert new_stamp.microsecond == 123456
    assert new_stamp.nanosecond == 123456000

    # Nanos
    new_stamp = stamp.replace(nanosecond=789123)
    assert new_stamp.microsecond == 789
    assert new_stamp.nanosecond == 789123

    # Micros
    new_stamp = stamp.replace(microsecond=456)
    assert new_stamp.microsecond == 456
    assert new_stamp.nanosecond == 456000
def test_from_rfc3339_wo_fraction():
    timestamp = "2016-12-20T21:13:47Z"
    expected = datetime_helpers.DatetimeWithNanoseconds(
        2016, 12, 20, 21, 13, 47, tzinfo=datetime.timezone.utc)
    stamp = datetime_helpers.DatetimeWithNanoseconds.from_rfc3339(timestamp)
    assert stamp == expected
def test_rfc3339_wo_nanos_w_leading_zero():
    stamp = datetime_helpers.DatetimeWithNanoseconds(2016, 12, 20, 21, 13, 47,
                                                     1234)
    assert stamp.rfc3339() == "2016-12-20T21:13:47.001234Z"