DEV Community

Cover image for Collaborating to Slack as an Open-Source Developer: Part 2
Henrique Sagara
Henrique Sagara

Posted on

Collaborating to Slack as an Open-Source Developer: Part 2

Recap of Part 1

In my first blog post, I shared my journey of contributing to the Slack SDK as an open-source developer. I tackled an issue related to ensuring the base URL for API requests had a trailing slash to simplify URL construction and prevent inconsistencies. If you haven’t read it yet, I recommend starting there to get the context for this follow-up.


A New Challenge Arises

After completing my first contribution, I was eager to tackle another issue in the same project. As I prepared to start, I noticed a problem in one of the authentication tests. The issue stemmed from the trailing slash feature I had previously implemented.

Here’s what happened: the base_url now always had a trailing slash appended during initialization. However, the api_method used in some test cases also started with a /. This combination caused a double slash (e.g., https://slack.com/api//auth.test), which broke some of the API requests.


Reporting the Issue

Realizing the significance of this bug, I quickly reported it to the maintainers and opened a new issue describing the problem. To ensure transparency and provide a clear solution path, I also submitted a pull request addressing the bug. However, the maintainers decided to revert my original merge to prevent disruptions in the main branch and asked me to submit a new PR with the necessary fixes and tests for edge cases.


The Fix and New Implementation

To address the problem, I reworked the _get_url function and added additional safeguards to prevent double slashes, even when both base_url and api_method contained trailing or leading slashes.

Here’s the updated implementation:

def _get_url(base_url: str, api_method: str) -> str:
    """Joins the base Slack URL and an API method to form an absolute URL.

    Args:
        base_url (str): The base URL (always ends with '/').
        api_method (str): The Slack Web API method. e.g., 'chat.postMessage'.

    Returns:
        str: The absolute API URL, e.g., 'https://slack.com/api/chat.postMessage'.
    """
    # Strip leading slash from api_method to prevent double slashes
    api_method = api_method.lstrip("/")
    return urljoin(base_url, api_method)
Enter fullscreen mode Exit fullscreen mode

Key adjustments

  1. Strip Leading Slash: By using .lstrip("/") on api_method, the function ensures no double slashes occur during concatenation.
  2. Test Case Enhancements: I expanded the test suite to cover scenarios such as:
    • base_url with and without a trailing slash.
    • api_method with and without a leading slash. Edge cases where both had slashes.

Here’s an example of the updated test:

def test_get_url_prevent_double_slash(self):
    api_url = _get_url("https://slack.com/api/", "/auth.test")
    self.assertEqual(api_url, "https://slack.com/api/auth.test", "Should prevent double slashes")

    api_url = _get_url("https://slack.com/api", "auth.test")
    self.assertEqual(api_url, "https://slack.com/api/auth.test", "Should handle base_url without trailing slash")

    api_url = _get_url("https://slack.com/api/", "auth.test")
    self.assertEqual(api_url, "https://slack.com/api/auth.test", "Should handle api_method without leading slash")

    api_url = _get_url("https://slack.com/api", "/auth.test")
    self.assertEqual(api_url, "https://slack.com/api/auth.test", "Should handle both inputs cleanly")
Enter fullscreen mode Exit fullscreen mode

Reflections on Testing and Edge Cases

This experience taught me the importance of thorough testing. Even though my original implementation passed all existing tests, it didn’t account for certain edge cases, such as leading slashes in api_method.

Here are my key takeaways:

1. Unit Tests Aren’t Foolproof: While unit tests help catch many issues, they might not cover all edge cases. A feature can still have loose ends, especially if the inputs vary widely.
2. Collaborate and Communicate: Reporting bugs promptly and discussing solutions with maintainers can prevent larger disruptions. Their decision to revert my changes emphasized the importance of keeping the main branch stable.
3. Iterate and Learn: Open-source contributions are iterative. Each step is an opportunity to improve, learn from feedback, and strengthen your coding practices.


Final Thoughts

Contributing to Slack’s SDK has been an invaluable experience. This journey, from implementing a new feature to resolving its unintended side effects, highlighted the complexities of real-world software development and the collaborative spirit of open source.

If you’re considering contributing to an open-source project, don’t let the fear of making mistakes hold you back. Every bug, every fix, and every test written is a step toward becoming a better developer.

What challenges have you faced in your open-source contributions? Let’s discuss in the comments below!

Top comments (0)