Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Temporary solution to embed screenshots and html snapshots into report with GEB and spock-reports #257

Open
seanfrenzel opened this issue Oct 20, 2023 · 3 comments
Labels

Comments

@seanfrenzel
Copy link

I was searching around and trying to find a simple solution to embed the screenshots and html snapshots given by GEB into the spock reports but couldn't really find a solution online (the geb-spock-reports project is deprecated) so I went ahead and made this code snippet shown below to do it in the cleanup step and using reportInfo(). This works well for me because I have a "SpecBase" class that gets inherited and used in all of the specs.

You can just paste the methods and the code and add in your own paths and it should work. I'm aware this isn't the most elegant solution and can be improved or possibly added as a configuration option into this project, but for now here is a solution for those wanting the reports and failures to be embedded.

It basically finds the geb artifacts and moves them into the spock-reports to be used by the html which is used in reportInfo() for embedding.

I'm open to any suggestions to get this as a PR or to improve it. I haven't setup a test project to showcase this so unfortunately I don't have an example image to give just yet!

    void cleanup() {
        def gebArtifactsPath = "build/reports/geb/path/to/specs/here/"
        File[] files = new File("$gebArtifactsPath$specificationContext.currentSpec.name").listFiles()

        insertReportArtifacts(files)
        insertFailureArtifacts(files)
    }

    /**
     * Finds all report artifacts taken. Moves them into the spock-report directory.
     * Then creates the html to insert into the reportInfo() which embeds them into the report
     *
     * @param files - geb artifacts from specs
     */
    def insertReportArtifacts(File[] files) {
        List<File> screenshots = files.findAll { !it.name.contains("failure.png") && it.name.contains(".png") }
        List<File> htmlSnapshots = files.findAll { !it.name.contains("failure.html") && it.name.contains(".html") }

        boolean reportFound = screenshots != null || htmlSnapshots != null
        if (reportFound) {
            def reportDir = new File('build/spock-reports')
            if (!reportDir.exists()) reportDir.mkdirs()

            htmlSnapshots.each { it.renameTo("$reportDir/$it.name") }
            screenshots.each { it.renameTo("$reportDir/$it.name") }

            def reportArtifactHtml = ""
            def screenshotIndex = 0

            htmlSnapshots.each { html ->
                def screenshot = screenshots[screenshotIndex]

                reportArtifactHtml += """                
                <table style="border:1px solid black;">
                    <thead>
                        <tr>
                            <th>[Html Report] ${html.name.replace('.html', '')}</th>
                        </tr>
                    </thead>
                    <tr>
                        <td><a href="${html.name}" target="_blank">html report</a></td>
                    </tr>
                    <thead>
                        <tr>
                            <th>[Image Report] ${screenshot.name.replace('.png', '')}</th>
                        </tr>
                        <tr>
                            <td><a href="${screenshot.name}" target="_blank"><img src="${screenshot.name}" width="400" height="400" align="center"></a></td>
                        </tr>
                    </thead>
                </table>    
                """
                screenshotIndex++
            }

            reportInfo(reportArtifactHtml)
        }
    }

    /**
     * Finds failure artifacts taken. Moves them into the spock-report directory.
     * Then creates the html to insert into the reportInfo() which embeds them into the report
     *
     * @param files - geb artifacts from specs
     */
    def insertFailureArtifacts(File[] files) {
        File screenshot = files.find { it.name.contains("failure.png") }
        File htmlSnapshot = files.find { it.name.contains("failure.html") }
        boolean failureFound = screenshot != null || htmlSnapshot != null

        if (failureFound) {
            def reportDir = new File('build/spock-reports')
            if (!reportDir.exists()) reportDir.mkdirs()

            htmlSnapshot.renameTo("$reportDir/$htmlSnapshot.name")
            screenshot.renameTo("$reportDir/$screenshot.name")

            def failureArtifactHtml = """                 
            <table style="border:1px solid black;">    
                <thead>
                    <tr>
                        <th>[Html Fail]</th>
                    </tr>
                </thead>                
                    <tr>
                        <td><a href="$htmlSnapshot.name" target="_blank">html failure</a></td>
                    </tr>
                <thead>
                    <tr>
                        <th>[Image Fail]</th>
                    </tr>
                    <tr>
                        <td><a href="$screenshot.name" target="_blank"><img src="$screenshot.name" width="400" height="400" align="center"></a></td>
                    </tr>
                </thead>                
            </table>"""

            reportInfo(failureArtifactHtml)
        }
    }
@renatoathaydes
Copy link
Owner

Hi,

Geb is not supported by spock-reports directly. I suggest that if you need this functionality, you should fork the existing plugin and maintain it as unfortunately the origianl maintainer seems to have abandoned it.
As far as I know, there's not a lot to maintain, just the occasional version bump and maybe fix a few small things... spock-reports itself is fairly mature so it won't be changing often at all - so once you fix the Geb plugin it should work for a long time.

@renatoathaydes
Copy link
Owner

Just to clarify it: I won't accept PRs to add Geb support directly to this project as I wouldn't be able to maintain that myself.

@seanfrenzel
Copy link
Author

Hi,

Geb is not supported by spock-reports directly. I suggest that if you need this functionality, you should fork the existing plugin and maintain it as unfortunately the origianl maintainer seems to have abandoned it. As far as I know, there's not a lot to maintain, just the occasional version bump and maybe fix a few small things... spock-reports itself is fairly mature so it won't be changing often at all - so once you fix the Geb plugin it should work for a long time.

I did try that in the past but it don't have the capacity to dive into it at the moment. It does look to do more than needed for my purposes so for now the above code snippet is a solution for me. Just figured I would share in case anyone else would find it helpful.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants