mirror of
https://github.com/joshuadavidthomas/django-language-server.git
synced 2025-09-11 04:46:38 +00:00
Add end-to-end testing framework with matrix support for Python and Django versions
This commit is contained in:
parent
42d089dcc6
commit
c4f50b6ef4
13 changed files with 1390 additions and 0 deletions
129
tests/e2e/test_basic_functionality.py
Normal file
129
tests/e2e/test_basic_functionality.py
Normal file
|
@ -0,0 +1,129 @@
|
|||
"""
|
||||
Basic end-to-end tests for django-language-server.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import asyncio
|
||||
import os
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
from pygls.client import JsonRPCClient
|
||||
from pygls.protocol import LanguageServerProtocol
|
||||
from pygls.types import (
|
||||
CompletionParams,
|
||||
DidOpenTextDocumentParams,
|
||||
Position,
|
||||
TextDocumentIdentifier,
|
||||
TextDocumentItem,
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_server_initialization(lsp_client: JsonRPCClient):
|
||||
"""Test that the server initializes correctly."""
|
||||
# Server should already be initialized by the fixture
|
||||
assert lsp_client.protocol.state == LanguageServerProtocol.STATE.INITIALIZED
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_template_tag_completion(
|
||||
lsp_client: JsonRPCClient, django_project: Path
|
||||
):
|
||||
"""Test template tag completion."""
|
||||
# Find a template file
|
||||
template_files = list(django_project.glob("**/templates/**/*.html"))
|
||||
assert template_files, "No template files found"
|
||||
|
||||
template_file = template_files[0]
|
||||
template_uri = f"file://{template_file}"
|
||||
|
||||
# Read the template content
|
||||
with open(template_file, "r") as f:
|
||||
template_content = f.read()
|
||||
|
||||
# Open the document in the language server
|
||||
await lsp_client.text_document_did_open_async(
|
||||
DidOpenTextDocumentParams(
|
||||
text_document=TextDocumentItem(
|
||||
uri=template_uri,
|
||||
language_id="django-html",
|
||||
version=1,
|
||||
text=template_content,
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
# Wait a moment for the server to process the document
|
||||
await asyncio.sleep(1)
|
||||
|
||||
# Find a position after {% to test completion
|
||||
lines = template_content.split("\n")
|
||||
for i, line in enumerate(lines):
|
||||
if "{%" in line:
|
||||
position = Position(
|
||||
line=i,
|
||||
character=line.index("{%") + 2,
|
||||
)
|
||||
break
|
||||
else:
|
||||
# If no {% found, add one at the end and update the document
|
||||
position = Position(line=len(lines), character=2)
|
||||
template_content += "\n{% "
|
||||
|
||||
# Update the document
|
||||
await lsp_client.text_document_did_change_async(
|
||||
{
|
||||
"textDocument": {
|
||||
"uri": template_uri,
|
||||
"version": 2,
|
||||
},
|
||||
"contentChanges": [
|
||||
{
|
||||
"text": template_content,
|
||||
}
|
||||
],
|
||||
}
|
||||
)
|
||||
await asyncio.sleep(1)
|
||||
|
||||
# Request completions
|
||||
completions = await lsp_client.completion_async(
|
||||
CompletionParams(
|
||||
text_document=TextDocumentIdentifier(uri=template_uri),
|
||||
position=position,
|
||||
)
|
||||
)
|
||||
|
||||
# Check that we got some completions
|
||||
assert completions is not None
|
||||
assert len(completions.items) > 0
|
||||
|
||||
# Check that common Django template tags are included
|
||||
tag_labels = [item.label for item in completions.items]
|
||||
common_tags = ["for", "if", "block", "extends", "include"]
|
||||
|
||||
for tag in common_tags:
|
||||
assert any(tag in label for label in tag_labels), f"Tag '{tag}' not found in completions"
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_django_settings_detection(
|
||||
lsp_client: JsonRPCClient, django_project: Path
|
||||
):
|
||||
"""Test that the server correctly detects Django settings."""
|
||||
# This is a basic test to ensure the server can detect Django settings
|
||||
# We'll use the workspace/executeCommand API to check this
|
||||
|
||||
result = await lsp_client.execute_command_async(
|
||||
{
|
||||
"command": "djls.debug.projectInfo",
|
||||
"arguments": [],
|
||||
}
|
||||
)
|
||||
|
||||
# The result should contain information about the Django project
|
||||
assert result is not None
|
||||
assert "django" in str(result).lower()
|
||||
assert "settings" in str(result).lower()
|
Loading…
Add table
Add a link
Reference in a new issue