You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: uxtesting.go
    path of file: ./repos/openreplay/backend/pkg/uxtesting
    
    the code of the file until where you have to start completion: package uxtesting

import (
	"openreplay/backend/pkg/db/postgres/pool"
)

type UXTesting interface {
	GetInfo(testID string) (*UXTestInfo, error)
	SetTestSignal(testSignal *TestSignal) error
	SetTaskSignal(taskSignal *TaskSignal) error
}

type uxTestingImpl st
    
func (u *uxTestingImpl) GetInfo(testID string) (*UXTestInfo, error) {
	info := &UXTestInfo{}
	var description, startingPath, guidelines, conclusion *string
	err := u.db.QueryRow(`
		SELECT
		    ut_tests.project_id,
			ut_tests.title,
			ut_tests.description,
			ut_tests.starting_path,
			ut_tests.status,
			ut_tests.require_mic,
			ut_tests.require_camera,
			ut_tests.guidelines,
			ut_tests.conclusion_message,
			json_agg(
					json_build_object(
							'task_id', ut_tests_tasks.task_id,
					    	'title', ut_tests_tasks.title,
							'description', ut_tests_tasks.description,
							'allow_typing', ut_tests_tasks.allow_typing
						)
				) AS tasks
		FROM
			ut_tests
				JOIN
			ut_tests_tasks ON ut_tests.test_id = ut_tests_tasks.test_id
		WHERE ut_tests.test_id = $1 AND ut_tests.status IN ('preview', 'in-progress')
		GROUP BY
			ut_tests.test_id;
	`, testID).Scan(&info.ProjectID, &info.Title, &description, &startingPath, &info.Status, &info.ReqMic, &info.ReqCamera,
		&guidelines, &conclusion, &info.Tasks)
	if err != nil {
		return nil, err
	}
	if description != nil {
		info.Description = *description
	}
	if startingPath != nil {
		info.StartingPath = *startingPath
	}
	if guidelines != nil {
		info.Guidelines = *guidelines
	}
	if conclusion != nil {
		info.Conclusion = *conclusion
	}
	return info, nil
}