Browse Source

Getting more OO, added some tests

Piotr Czajkowski 7 years ago
parent
commit
734cded5e3
10 changed files with 258 additions and 21 deletions
  1. 8 0
      app.go
  2. 45 0
      app_test.go
  3. 2 2
      html/tms.html
  4. 3 3
      search.go
  5. 78 0
      search_test.go
  6. 7 7
      server.go
  7. 37 0
      testFiles/searchResults.json
  8. 28 0
      testFiles/tms.json
  9. 7 9
      tm.go
  10. 43 0
      tm_test.go

+ 8 - 0
app.go

@@ -8,6 +8,7 @@ import (
 	"log"
 	"net/http"
 	"os"
+	"strings"
 	"time"
 )
 
@@ -17,6 +18,13 @@ type Application struct {
 	Delay                                       time.Duration
 }
 
+func (app *Application) SetBaseURL(url string) {
+	if !strings.HasSuffix(url, "/") {
+		url += "/"
+	}
+	app.BaseURL = url
+}
+
 func JsonDecoder(data io.ReadCloser, target interface{}) {
 	decoder := json.NewDecoder(data)
 

+ 45 - 0
app_test.go

@@ -0,0 +1,45 @@
+package main
+
+import (
+	"strings"
+	"testing"
+)
+
+func TestSetBaseURL(t *testing.T) {
+	urlWithSlash := "http://test.com:880/test/"
+	urlWithoutSlash := "http://test.com:880/test"
+
+	t.Log("Testing if mandatory slash is added to the end of BaseURL.")
+	var app Application
+	app.SetBaseURL(urlWithSlash)
+	if strings.HasSuffix(app.BaseURL, "//") {
+		t.Errorf("URL has been malformed: %v", app.BaseURL)
+	} else {
+		t.Log("URL with slash was set correctly!")
+	}
+
+	app.SetBaseURL(urlWithoutSlash)
+	if !strings.HasSuffix(app.BaseURL, "/") {
+		t.Errorf("URL has been malformed: %v", app.BaseURL)
+	} else {
+		t.Log("URL without slash was set correctly!")
+	}
+}
+
+func TestLoadLanguages(t *testing.T) {
+	var app Application
+	app.LoadLanguages()
+
+	testLanguageCode := "dan"
+	testLanguage := "Danish"
+
+	t.Log("Testing if languages have been successfully loaded to app.Languages dictionary.")
+	_, ok := app.Languages[testLanguageCode]
+	if !ok {
+		t.Fatalf("There's no key '%v'!", testLanguageCode)
+	} else if app.Languages[testLanguageCode] == testLanguage {
+		t.Log("Languages are in dictionary!")
+	} else {
+		t.Fatalf("Value of key '%v' isn't '%v'", testLanguageCode, testLanguage)
+	}
+}

+ 2 - 2
html/tms.html

@@ -11,7 +11,7 @@
     </head>
     <body>
         <a href="/">Go back to start</a>
-        <h1>We have {{len .TMs}} TMs</h1>
+        <h1>We have {{len .}} TMs</h1>
             <table>
                 <tr style='text-align: left'>
                     <th>Name</th>
@@ -19,7 +19,7 @@
                     <th>Target language</th>
                     <th>No. of segments</th>
                 </tr>
-                {{range .TMs}}
+                {{range .}}
                     <tr style='text-align: left'>
                         <td><b>{{.FriendlyName}}</b></td>
                         <td>{{.SourceLangCode}}</td>

+ 3 - 3
search.go

@@ -57,7 +57,7 @@ func PostQuery(requestURL string, searchJSON []byte) *http.Response {
 	return resp
 }
 
-func Search(TMs TMList, text string) SearchResults {
+func (app *Application) Search(TMs []TM, text string) SearchResults {
 	searchString := "{ \"SearchExpression\": [ \"" + text + "\" ]}"
 	searchJSON := []byte(searchString)
 
@@ -67,7 +67,7 @@ func Search(TMs TMList, text string) SearchResults {
 	finalResults.SearchPhrase = text
 
 	var results []CleanedResults
-	for _, tm := range TMs.TMs {
+	for _, tm := range TMs {
 		getTM := tmURL + tm.TMGuid
 		concordanceURL := getTM + "/concordance"
 		requestURL := concordanceURL + app.AuthString
@@ -77,7 +77,7 @@ func Search(TMs TMList, text string) SearchResults {
 		if resp.StatusCode == 401 {
 			time.Sleep(app.Delay)
 			app.Login()
-			return Search(TMs, text)
+			return app.Search(TMs, text)
 		}
 
 		var tempResults ResultsFromServer

+ 78 - 0
search_test.go

@@ -0,0 +1,78 @@
+package main
+
+import (
+	"fmt"
+	"io/ioutil"
+	"log"
+	"net/http"
+	"net/http/httptest"
+	"os"
+	"testing"
+)
+
+func TestSegmentCleanup(t *testing.T) {
+	sourceSegment := "<seg>This is test</seg>"
+	targetSegment := "<seg>This is test for target</seg>"
+
+	cleanedSourceSegment := "This is test"
+	cleanedTargetSegment := "This is test for target"
+
+	segment := Segment{sourceSegment, targetSegment}
+	segment.Clean()
+
+	t.Log("Testing if <seg> tags will be removed from segments.")
+	if segment.Source == cleanedSourceSegment && segment.Target == cleanedTargetSegment {
+		t.Log("Segments have been cleaned!")
+	} else {
+		t.Fatalf("Segments still have tags!\nSource: %v\nTarget: %v", segment.Source, segment.Target)
+	}
+}
+
+func ServeSearchResults() *httptest.Server {
+	searchResults, err := ioutil.ReadFile("./testFiles/searchResults.json")
+	if err != nil {
+		log.Fatalf("Error reading file: %v\n", err)
+	}
+
+	f := func(w http.ResponseWriter, r *http.Request) {
+		w.WriteHeader(200)
+		w.Header().Set("Content-Type", "application/json")
+		fmt.Fprintln(w, string(searchResults))
+	}
+
+	return httptest.NewServer(http.HandlerFunc(f))
+}
+
+func TestSearch(t *testing.T) {
+	server := ServeSearchResults()
+	defer server.Close()
+
+	var app Application
+	app.SetBaseURL(server.URL)
+
+	tmsJSON, err := os.Open("./testFiles/tms.json")
+	defer tmsJSON.Close()
+	if err != nil {
+		t.Fatalf("error reading tms: %v", err)
+		return
+	}
+
+	var tms []TM
+	JsonDecoder(tmsJSON, &tms)
+
+	testSourceSegment1 := "<bpt i='1' type='bold'>{}</bpt>Something Test/ Whatever<ept i='1'>{}</ept>"
+	testSourceSegment2 := "<bpt i='1' type='bold'>{}</bpt>Another Test/ Anything<ept i='1'>{}</ept>"
+
+	t.Log("Testing search method.")
+	searchResults := app.Search(tms, "something")
+	if searchResults.TotalResults != 4 {
+		t.Fatalf("Not all results returned! (%v)", searchResults.TotalResults)
+	}
+
+	segment := searchResults.Results[0].Segments[0]
+	if segment.Source == testSourceSegment1 || segment.Source == testSourceSegment2 {
+		t.Log("Search results fine!")
+	} else {
+		t.Fatalf("Something is wrong with returned segment!\n%v", segment)
+	}
+}

+ 7 - 7
server.go

@@ -31,7 +31,7 @@ func DisplaySearchResults(w http.ResponseWriter, r *http.Request) {
 	if searchPhrase != "" {
 		var searchResults SearchResults
 		if language == "" || app.CheckLanguage(language) {
-			searchResults = Search(GetTMs(language), searchPhrase)
+			searchResults = app.Search(app.GetTMs(language), searchPhrase)
 			Logger(r, searchResults.TotalResults)
 		} else {
 			errorPage.Execute(w, "Language not valid!")
@@ -53,18 +53,18 @@ func DisplaySearchResults(w http.ResponseWriter, r *http.Request) {
 func DisplayTMs(w http.ResponseWriter, r *http.Request) {
 	language := r.URL.Query().Get("lang")
 
-	var list TMList
+	var TMList []TM
 	if language == "" || app.CheckLanguage(language) {
-		list = GetTMs(language)
-		Logger(r, len(list.TMs))
+		TMList = app.GetTMs(language)
+		Logger(r, len(TMList))
 	} else {
 		errorPage.Execute(w, "Language not valid!")
 		return
 	}
 
-	if len(list.TMs) > 0 {
+	if len(TMList) > 0 {
 		t := template.Must(template.New("tms.html").ParseFiles("./html/tms.html"))
-		t.Execute(w, list)
+		t.Execute(w, TMList)
 	} else {
 		errorPage.Execute(w, "No TMs to display!")
 	}
@@ -72,7 +72,7 @@ func DisplayTMs(w http.ResponseWriter, r *http.Request) {
 
 func main() {
 	flag.Parse()
-	app.BaseURL = *url
+	app.SetBaseURL(*url)
 	if app.BaseURL == "" {
 		log.Panicln("Can't do anything without URL to API")
 	}

+ 37 - 0
testFiles/searchResults.json

@@ -0,0 +1,37 @@
+{
+    "ConcResult": [
+        {
+            "ConcordanceTextRanges": [
+                {
+                    "Length": 9,
+                    "Start": 0
+                }
+            ],
+            "ConcordanceTranslationRanges": [],
+            "Length": 9,
+            "StartPos": 0,
+            "TMEntry": {
+                "SourceSegment": "<seg><bpt i='1' type='bold'>{}</bpt>Something Test/ Whatever<ept i='1'>{}</ept></seg>",
+                "TargetSegment": "<seg><bpt i='1' type='bold'>{}</bpt>Whatever Test/Something<ept i='1'>{}</ept></seg>"
+            }
+        },
+        {
+            "ConcordanceTextRanges": [
+                {
+                    "Length": 9,
+                    "Start": 0
+                }
+            ],
+            "ConcordanceTranslationRanges": [],
+            "Length": 9,
+            "StartPos": 0,
+            "TMEntry": {
+                "SourceSegment": "<seg><bpt i='1' type='bold'>{}</bpt>Another Test/ Anything<ept i='1'>{}</ept></seg>",
+                "TargetSegment": "<seg><bpt i='1' type='bold'>{}</bpt>Anything Test/Another<ept i='1'>{}</ept></seg>"
+            }
+        }
+    ],
+    "ConcTransResult": [],
+    "Errors": [],
+    "TotalConcResult": 2
+}

+ 28 - 0
testFiles/tms.json

@@ -0,0 +1,28 @@
+[
+    {
+        "AccessLevel": 1,
+        "Client": "",
+        "Domain": "",
+        "FriendlyName": "Test TM 1",
+        "NumEntries": 1000,
+        "Project": "",
+        "SourceLangCode": "ger-DE",
+        "Subject": "",
+        "TMGuid": "bc02a127-6599-4def-a5f3-something123",
+        "TMOwner": "testUser",
+        "TargetLangCode": "ita-IT"
+    },
+    {
+        "AccessLevel": 1,
+        "Client": "",
+        "Domain": "",
+        "FriendlyName": "Test TM 2",
+        "NumEntries": 1500,
+        "Project": "",
+        "SourceLangCode": "fre-FR",
+        "Subject": "",
+        "TMGuid": "a3b9c179-5bd2-43a8-a234-something456",
+        "TMOwner": "testUser",
+        "TargetLangCode": "ger-DE"
+    }
+]

+ 7 - 9
tm.go

@@ -6,11 +6,9 @@ import (
 	"time"
 )
 
-type TMList struct {
-	TMs []struct {
-		NumEntries, AccessLevel                                                                         int
-		Client, Domain, FriendlyName, Project, SourceLangCode, Subject, TMGuid, TMOwner, TargetLangCode string
-	}
+type TM struct {
+	NumEntries, AccessLevel                                                                         int
+	Client, Domain, FriendlyName, Project, SourceLangCode, Subject, TMGuid, TMOwner, TargetLangCode string
 }
 
 func GetQuery(url string) *http.Response {
@@ -22,7 +20,7 @@ func GetQuery(url string) *http.Response {
 	return resp
 }
 
-func GetTMs(language string) TMList {
+func (app *Application) GetTMs(language string) []TM {
 	tmURL := app.BaseURL + "tms/"
 	var queryURL string
 	if language == "" {
@@ -36,11 +34,11 @@ func GetTMs(language string) TMList {
 	if resp.StatusCode == 401 {
 		time.Sleep(app.Delay)
 		app.Login()
-		return GetTMs(language)
+		return app.GetTMs(language)
 	}
 
-	var results TMList
-	JsonDecoder(resp.Body, &results.TMs)
+	var results []TM
+	JsonDecoder(resp.Body, &results)
 
 	return results
 }

+ 43 - 0
tm_test.go

@@ -0,0 +1,43 @@
+package main
+
+import (
+	"fmt"
+	"io/ioutil"
+	"net/http"
+	"net/http/httptest"
+	"os"
+	"testing"
+)
+
+func ServeTMs() *httptest.Server {
+	tms, err := ioutil.ReadFile("./testFiles/tms.json")
+	if err != nil {
+		fmt.Fprintf(os.Stderr, "Error reading file: %v\n", err)
+	}
+
+	f := func(w http.ResponseWriter, r *http.Request) {
+		w.WriteHeader(200)
+		w.Header().Set("Content-Type", "application/json")
+		fmt.Fprintln(w, string(tms))
+	}
+
+	return httptest.NewServer(http.HandlerFunc(f))
+}
+
+func TestGetTMs(t *testing.T) {
+	server := ServeTMs()
+	defer server.Close()
+
+	var app Application
+	app.SetBaseURL(server.URL)
+
+	t.Log("Testing if TMs are properly read from the server.")
+	tms := app.GetTMs("")
+	if len(tms) != 2 {
+		t.Fatalf("Not all TMs read! (%v)", len(tms))
+	} else if tms[0].FriendlyName == "Test TM 1" || tms[0].FriendlyName == "Test TM 2" {
+		t.Log("TMs properly read!")
+	} else {
+		t.Fatalf("Something went wrong while reading TMs!\n%v", tms)
+	}
+}