Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ on:
- main

jobs:
build-maven:
build:
runs-on: ubuntu-latest
permissions:
contents: read
Expand Down
2 changes: 1 addition & 1 deletion examples/flask/pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[tool.poetry]
name = "passwordless-example"
version = "0.1.0"
version = "0.1.1"
description = "Passwordless.dev Python SDK usage Example"
authors = [
"Bitwarden <hello@bitwarden.com>"
Expand Down
423 changes: 210 additions & 213 deletions poetry.lock

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[tool.poetry]
name = "passwordless"
version = "0.1.0"
version = "0.1.1"
description = "Passwordless.dev Python SDK"
authors = [
"Bitwarden <hello@bitwarden.com>"
Expand Down
2 changes: 1 addition & 1 deletion src/passwordless/__init__.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
"""The official Bitwarden Passwordless.dev Python library for Python
3+."""

__version__ = "0.0.1"
__version__ = "0.1.1"

from .client import PasswordlessClient, PasswordlessClientBuilder
from .config import PasswordlessOptions
Expand Down
4 changes: 3 additions & 1 deletion src/passwordless/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,9 @@ class RegisterToken:
user_verification: str = "preferred"
aliases: List[str] = field(default_factory=list)
alias_hashing: bool = True
expires_at: datetime = datetime.utcnow() + timedelta(minutes=2)
expires_at: datetime = field(
default_factory=lambda: datetime.utcnow() + timedelta(minutes=2)
)


@dataclass
Expand Down
13 changes: 13 additions & 0 deletions tests/data_factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,19 @@ def build_register_token():
)


def build_register_token_without_expires_at():
return RegisterToken(
user_id=USER_ID,
username="TestUser",
attestation="none",
authenticator_type="any",
discoverable=True,
user_verification="preferred",
aliases=[],
alias_hashing=True,
)


def build_registered_token():
return RegisteredToken(
"register_k8QgFOUhu_arMUbfi_93OZFdc6M39tPdmmNbx5xF"
Expand Down
35 changes: 35 additions & 0 deletions tests/test_models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import time
from datetime import datetime, timedelta, timezone

from dateutil import parser

from tests.data_factory import (
build_register_token,
build_register_token_without_expires_at,
)


def test_new_register_token_expires_at_provided() -> None:
register_token = build_register_token()
assert register_token.expires_at == parser.parse(
"2023-09-09T20:07:02.365573Z"
)


def test_new_register_token_expires_at_default() -> None:
time_now = datetime.now(timezone.utc).replace(tzinfo=None)
register_token = build_register_token_without_expires_at()
diff = register_token.expires_at - time_now
assert diff.total_seconds() > 0
assert diff < timedelta(minutes=3)
assert diff >= timedelta(minutes=2)


def test_new_register_token_expires_at_default_sleep() -> None:
register_token_1 = build_register_token_without_expires_at()
time.sleep(0.1)
register_token_2 = build_register_token_without_expires_at()
assert register_token_1.expires_at != register_token_2.expires_at
diff = register_token_2.expires_at - register_token_1.expires_at
assert diff.total_seconds() > 0
assert diff < timedelta(seconds=10)