Skip to content

Commit

Permalink
initial attempt at writing test for urls (reflex-dev#2689)
Browse files Browse the repository at this point in the history
* initial attempt at writing test for urls

* turn it into a pytest test

* fix precommit and add wrong url to make sure test work

* fix darglint error and fix url set error

* black error

* add to test .md files in reflex as well

* update to fix masen comment

* black formatting

* Fix trailing slash in reflex/state.py

---------

Co-authored-by: Tom Gotsman <[email protected]>
Co-authored-by: Tom Gotsman <[email protected]>
Co-authored-by: Masen Furer <[email protected]>
  • Loading branch information
4 people authored Feb 29, 2024
1 parent 0a18eaa commit 93fc269
Show file tree
Hide file tree
Showing 6 changed files with 74 additions and 5 deletions.
67 changes: 67 additions & 0 deletions integration/test_urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
"""Integration tests for all urls in Reflex."""
import os
import re
from pathlib import Path

import pytest
import requests


def check_urls(repo_dir):
"""Check that all URLs in the repo are valid and secure.
Args:
repo_dir: The directory of the repo.
Returns:
A list of errors.
"""
url_pattern = re.compile(r'http[s]?://reflex\.dev[^\s")]*')
errors = []

for root, _dirs, files in os.walk(repo_dir):
if "__pycache__" in root:
continue

for file_name in files:
if not file_name.endswith(".py") and not file_name.endswith(".md"):
continue

file_path = os.path.join(root, file_name)
try:
with open(file_path, "r", encoding="utf-8", errors="ignore") as file:
for line in file:
urls = url_pattern.findall(line)
for url in set(urls):
if url.startswith("http://"):
errors.append(
f"Found insecure HTTP URL: {url} in {file_path}"
)
url = url.strip('"\n')
try:
response = requests.head(
url, allow_redirects=True, timeout=5
)
response.raise_for_status()
except requests.RequestException as e:
errors.append(
f"Error accessing URL: {url} in {file_path} | Error: {e}, , Check your path ends with a /"
)
except Exception as e:
errors.append(f"Error reading file: {file_path} | Error: {e}")

return errors


@pytest.mark.parametrize(
"repo_dir",
[Path(__file__).resolve().parent.parent / "reflex"],
)
def test_find_and_check_urls(repo_dir):
"""Test that all URLs in the repo are valid and secure.
Args:
repo_dir: The directory of the repo.
"""
errors = check_urls(repo_dir)
assert not errors, "\n".join(errors)
2 changes: 1 addition & 1 deletion reflex/.templates/apps/blank/code/blank.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

import reflex as rx

docs_url = "https://reflex.dev/docs/getting-started/introduction"
docs_url = "https://reflex.dev/docs/getting-started/introduction/"
filename = f"{config.app_name}/{config.app_name}.py"


Expand Down
4 changes: 3 additions & 1 deletion reflex/.templates/apps/sidebar/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,8 @@ In this template, we have a sidebar component in `{your_app}/components/sidebar.

### Adding State

As your app grows, we recommend using [substates](https://reflex.dev/docs/substates/overview/) to organize your state.
As your app grows, we recommend using [substates](https://reflex.dev/docs/substates/overview/)
to organize your state.

You can either define substates in their own files, or if the state is
specific to a page, you can define it in the page file itself.
2 changes: 1 addition & 1 deletion reflex/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -379,7 +379,7 @@ def _generate_component(component: Component | ComponentCallable) -> Component:
raise TypeError(
"You may be trying to use an invalid Python function on a state var. "
"When referencing a var inside your render code, only limited var operations are supported. "
"See the var operation docs here: https://reflex.dev/docs/state/vars/#var-operations"
"See the var operation docs here: https://reflex.dev/docs/vars/var-operations/"
) from e
raise e

Expand Down
2 changes: 1 addition & 1 deletion reflex/state.py
Original file line number Diff line number Diff line change
Expand Up @@ -278,7 +278,7 @@ def __init__(
if not _reflex_internal_init and not is_testing_env():
raise RuntimeError(
"State classes should not be instantiated directly in a Reflex app. "
"See https://reflex.dev/docs/state for further information."
"See https://reflex.dev/docs/state/ for further information."
)
kwargs["parent_state"] = parent_state
super().__init__(*args, **kwargs)
Expand Down
2 changes: 1 addition & 1 deletion reflex/utils/prerequisites.py
Original file line number Diff line number Diff line change
Expand Up @@ -1036,7 +1036,7 @@ def show_rx_chakra_migration_instructions():
)
console.log("")
console.log(
"For more details, please see https://reflex.dev/blog/2024-02-16-reflex-v0.4.0"
"For more details, please see https://reflex.dev/blog/2024-02-16-reflex-v0.4.0/"
)


Expand Down

0 comments on commit 93fc269

Please sign in to comment.